Python 套接字编程学习历程

1.什么是socket?

Socket中文译作:套接字,socket是来建立‘通信’的基础,建立连接,传输数据‘通信端点’。
每一个套接字就是一组接口与端口的组合,用来发送或者接受信息。

socket编程流程

服务器端 客户端
创建 socket 套接字 创建socket
bind 绑定
listen 监听
accept 建立连接 connect
接受请求连接 发送 send
发送数据 接收recv

如图:


一般的socket编程流程都可以按照上述流程模块来进行

Tcp套接字编程

# coding: utf-8
#  服务器端代码
from socket import *print ('我是服务端!')HOST = ''
PORT = 50007
BUFSIZ = 1024
ADDR = (HOST,PORT) # 创建端口,规定缓冲区大小s = socket(AF_INET, SOCK_STREAM)  # 创建TCP socket对象
s.bind(ADDR)  # 绑定地址
s.listen(4)  # 监听TCP,4代表:操作系统可以挂起(未处理请求时等待状态)的最大连接数量。该值至少为1while 1:print("等待连接...")client, addr = s.accept()  # 开始被动接受TCP客户端的连接。print ('连接的地址', addr)while 1:data = client.recv(BUFSIZ).decode()  # 接受TCP数据 decode是由于此处接受bytes而不是 str类型print("接收到数据:",data)if not data: breakclient.send(data.encode())  # 把从客户端接收来的数据完整的,发送给客户端client.close()
s.close()

客户端代码

# coding: utf-8
import socketprint ('我是客户端!')HOST = 'localhost'    # 服务器的ip
PORT = 50007              # 需要连接的服务器的端口
BUFSIZ = 1024
ADDR = (HOST,PORT)c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect(ADDR)while 1:data=input("请输入:\n >>>")if not data:breakc.sendall(data.encode())  # 发送‘Hello,world’给服务器data = c.recv(BUFSIZ).decode()if not data:breakprint ('接收到', repr(data))  # 打印从服务器接收回来的数据
c.close()

本次在学习套接字的时候遇到 TypeError: a bytes-like object is required, not 'str'此类型的报错,网上查找资料显示该问题主要是由于当前操作的字符串是bytes类型的字符串对象,并对该bytes类型的字符串对象进行按照str类型的操作。

解决方法

转码成为str类型的或者是将对问题进行str类型操作转化为对bytes类型的操作。
这里采用类型转换函数encode(),decode()

字符可以通过encode()方法可以编码为指定的bytes
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes,
要把bytes变为str,就需要用decode()方法

这里把一些套接字的一些相关函数贴出来,希望大家熟悉一些相关函数

s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。sk.listen(backlog)开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5这个值不能无限大,因为要在内核中维护连接队列sk.setblocking(bool)是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。sk.accept()接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。接收TCP 客户的连接(阻塞式)等待连接的到来s.connect(address)
连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。sk.connect_ex(address)同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061sk.close()关闭套接字sk.recv(bufsize[,flag])接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。sk.recvfrom(bufsize[.flag])与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。sk.send(string[,flag])将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。sk.sendall(string[,flag])将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。内部通过递归调用send,将所有内容发送出去。sk.sendto(string[,flag],address)将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。sk.settimeout(timeout)设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )sk.getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。sk.getsockname()返回套接字自己的地址。通常是一个元组(ipaddr,port)sk.fileno()套接字的文件描述符

初次学习python,先用比较简单的套接字来深入学习python,并学习一些简单的网络知识,心得确实有一点,python要学的好的话,还是要多敲代码

Python 套接字编程相关推荐

  1. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

  2. python的socket编程接收浏览器上传的文件_使用python套接字编程将文件发送到浏览器...

    我正在尝试使用python(仅限于套接字编程)向客户机(浏览器:Chrome)发送一个文件(mp3).我的问题是文件被下载了,而不是在浏览器上进行流式传输.我不明白我哪里错了.请告诉我.在 另外,下载 ...

  3. 完美解决Python套接字编程时TCP断包与粘包问题

    首先,来看一个代码,使用TCP协议,发送端发送一句话,接收端接收并显示,运行完全正常. 接下来,把客户端代码稍微修改一下,连续发送多个数据, 按照正常的想法,在服务端输出的信息应该是分为多行的,这样才 ...

  4. 使用Python套接字编程的视频聊天应用

    在这场流行病中,我们正经历着大量的公司转向在线平台,并在家里开始伟大的倡议工作,但如果我们不能与团队联系起来,这怎么可能呢? 因此,为了解决这一挑战,公司开始使用软件,允许他们在摄像头和其他资源的帮助 ...

  5. python网络套接字_Python网络编程 Python套接字编程

    Python 提供了两个级别访问的网络服务. 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络服 ...

  6. python套接字编程_Python网络编程 Python套接字编程

    Python 提供了两个级别访问的网络服务. 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络服 ...

  7. python编程示例_Python套接字编程–服务器,客户端示例

    python编程示例 Good Day Learners! In our previous tutorial, we discussed about Python unittest module. T ...

  8. python 图形化socket编程_Python黑帽编程2.8 套接字编程

    Python黑帽编程2.8 套接字编程 套接字编程在本系列教程中地位并不是很突出,但是我们观察网络应用,绝大多数都是基于Socket来做的,哪怕是绝大多数的木马程序也是如此.官方关于socket编程的 ...

  9. python中typeerror怎么解决_Python 3中套接字编程中遇到TypeError: 'str' does not support the buffer interface的解决办法...

    目前正在学习python,使用的工具为python3.2.3.发现3x版本和2x版本有些差异,在套接字编程时,困扰了我很久,先将python核心编程书中的例子 代码如下: 服务器端: #Echo se ...

最新文章

  1. mushroom 0.3 发布,metric for java 的方案
  2. qt5.5.1配置winpcap4.1.2
  3. mysql coreseek_centos+php+coreseek+sphinx+mysql之一coreseek安装篇
  4. js正则表达exec和match的区别(转)
  5. Periodic Signal
  6. linux find 用法详解 + 实例
  7. 重磅!2018人脸识别研究报告(附全文下载)
  8. 字符串解压缩c语言除哈夫曼,C语言实现压缩二例(示例代码)
  9. 关于SQL注入及防御
  10. 怎么从零基础学计算机打字,新手学电脑打字 0基础打字快速上手教程
  11. 微电子专业要学c语言吗,微电子不是人能学的!
  12. 模块已加载,但找不到入口点DLLRegisterServer
  13. 网络协议-dhcp报文分析
  14. 2019年私域流量的演变历程剖析:定义、演变、成因、改变企业营销决策!
  15. Monorail学习笔记
  16. 可过滤多种广告的“ADM(阿呆喵)广告拦截工具
  17. 刘墉写给女儿的“考前须知”,送给每个即将上战场的学子
  18. [ISUX译]iOS 9人机界面指南(二):设计策略
  19. popwindow 加个边框_popupWindow自定义(1)
  20. Firefox火狐浏览器使用小技巧

热门文章

  1. 手机连无线网后没有网络连接到服务器,手机无线网络连接上但上不了网
  2. ARouter使用(管用)
  3. 2021 年 3 月程序员工资统计新出炉
  4. 【Redis】Redis高可用之Cluster主从模式详解(Redis专栏启动)
  5. lxf-java selected study
  6. 用TensorFlow训练一个物体检测器(手把手教学版)
  7. 如何提高网站流量?只要这4步!
  8. 2021-07-20LabVIEW编程LabVIEW开发 控制Dantec 激光多普勒测试仪LDV例程与相关资料
  9. (H-ADCP)声学多普勒剖面流量计
  10. Android调用微博接口