Socket是一个TCP/IP网络通讯的抽象层,提供一系列的数据交互操作接口,这样开发者可以不再关注于具体的协议处理细节,从而快速的让自己的程序实现网络数据交互。
简单来说,程序进程之间需要通过socket进行通信,它类似于一个插件,所有进程必须进行关联才能工作。只要是与网络相关的应用程序,都必须使用socket。
Python的Socket编程中一般分为TCP和UDP两种通讯协议,而socket是基于C/S架构的,所以socket网络编程,需要编写客户端程序和服务端程序。
TCP通信流程
客户端流程
- 初始化socket()
- 使用ip和端口号connect()连接服务器
- 使用recv()接收数据,send()发送数据与服务器进行交互
- 关闭socket()
服务端流程
- 初始化socket()
- 使用bind()绑定ip和端口号
- 使用listen()监听消息
- 获取客户端的套接字地址accept()
- 使用recv()接收数据,send()发送数据与客户端进行交互
- 关闭socket()
在Python中使用socket.socket类即可实现TCP程序开发socket.socket(AddressFamily, Type)
参数说明:
- AddressFamily 表示IP地址类型, 分为TPv4和IPv6
- Type 表示传输协议类型
常用方法如下:
函数 | 描述 |
---|---|
socket() | 获取socket类对象 |
bind((hostname, port)) | 在指定主机的端口绑定监听 |
listen() | 在绑定端口上开启监听,参数表示最大等待建立连接的个数 |
accept() | 等待客户端连接,连接后返回客户端地址 |
send(data) | 发送数据,data 是二进制数据 |
recv(buffer) | 表示接收数据, buffersize 是每次接收数据的长度 |
close() | 关闭套接字连接 |
connect((hostname, port)) | 设置要连接的主机名称与端口号 |
使用Python实现TCP通信代码:
服务器端:
代码语言:javascript复制import socket
# 创建一个socket对象,默认TCP套接字
s = socket.socket()
# 绑定端口
s.bind(('127.0.0.1',9006))
# 监听端口
s.listen(5)
print("正在连接中……")
# 建立连接之后,持续等待连接
while 1:
# 阻塞等待连接
sock,addr = s.accept()
print(sock,addr)
# 一直保持发送和接收数据的状态
while 1:
text = sock.recv(1024)
# 客户端发送的数据为空的无效数据
if len(text.strip()) == 0:
print("服务端接收到客户端的数据为空")
else:
print("收到客户端发送的数据为:{}".format(text.decode()))
content = input("请输入发送给客户端的信息:")
# 返回服务端发送的信息
sock.send(content.encode())
sock.close()
客户端:
代码语言:javascript复制import socket
# 创建一个socket对象
s1 = socket.socket()
s1.connect(('127.0.0.1', 9006))
# 不断发送和接收数据
while 1:
send_data = input("客户端要发送的信息:")
# socket传递的都是bytes类型的数据,需要转换一下
s1.send(send_data.encode())
# 接收数据,最大字节数1024,对返回的二进制数据进行解码
text = s1.recv(1024).decode()
print("服务端发送的数据:{}".format(text))
print("------------------------------")
因为网络通信需要通过ip地址找到网络中的设备,通过端口号找到对应进程的端口,所以客户端ip端口必须和客户端ip端口保持一致。 当客户端和服务端建立连接后,退出程序后端口号不会立即释放,需要等待大概1-2分钟。可以通过设置端口复用解决(
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
)
上面的代码实现了TCP服务端程序只能服务于一个客户端,如果服务端程序要和多个客户端通信,则可以使用多线程或者socketserver
模块,socketserver是socket的再封装,从而简化socket网络编程的方法。
更多关于python socket的使用,可以查看官方文档学习:
https://docs.python.org/zh-cn/3/library/socketserver.html#module-socketserver
https://docs.python.org/zh-cn/3/library/socket.html
https://docs.python.org/zh-cn/3/howto/sockets.html