- socket 模块是 Python 标准库中的一个模块,提供了对网络编程的支持,允许在应用程序之间进行网络通信,实现网络套接字的创建、连接、发送和接收数据等
- socket 模块支持 TCP 套接字(socket.SOCK_STREAM)和 UDP 套接字(socket.SOCK_DGRAM)
- 网络通信:在不同计算节点可以通过网络进行通信,用于分布式计算、数据共享和协同工作等任务。
- 远程控制数据传输:在不同计算节点之间传输数据
- 并行计算:在多个计算节点之间进行并行计算,将任务分发到不同的节点上,并通过套接字进行通信和协同工作,以实现高性能的并行计算。
- 实时数据传输:传感器数据的采集和实时处理,网络视频流的传输和处理等
socket 模块的创建与应用
创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- socket.AF_INET:这个参数指定了地址簇,表示使用IPv4地址族
- socket.SOCK_STREAM:这个参数指定了套接字类型,表示使用流式套接字(TCP)
绑定地址和端口
- 服务器的地址
- host = 'localhost'
- 服务器的端口号
- port = 12345
- s.bind((host, port))
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
port = 12345
s.bind((host, port))
监听连接
s.listen(1)
- 可以传入一个参数 backlog,表示等待连接队列的最大长度
连接与接收解码
conn, addr = s.accept()
- 调用 accept() 方法会阻塞程序的执行,直到有客户端连接进来。一旦有客户端连接进来,accept() 方法会返回两个值:
- conn:表示与客户端建立的新的套接字对象,可以使用该对象与客户端进行通信
- 这个新的套接字对象专门用于与该客户端进行通信
- addr:表示客户端的地址信息,通常是一个元组,包含客户端的IP地址和端口号
- conn:表示与客户端建立的新的套接字对象,可以使用该对象与客户端进行通信
signal = conn.recv(1024).decode()
- 在与客户端建立的套接字对象 conn 上调用 recv() 方法,用于接收客户端发送的数据。
- recv() 方法用于从套接字接收数据,它的参数指定了每次最多接收的字节数
- 接收到的数据是一个字节序列(bytes),通常需要将其解码为字符串进行处理
发送信号
s.send(signal.encode())
关闭 socket
socket.close() #关闭套接字连接
Example
process1.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
port = 12345
s.bind((host, port))
s.listen(1)
print("Waiting for connection...")
conn, addr = s.accept()
print("Connection established with", addr)
signal = conn.recv(1024).decode()
print("Received signal:", signal)
response = "Signal received from process1.py"
conn.send(response.encode())
conn.close()
process2.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
port = 12345
s.connect((host, port))
signal = "Signal from process2.py"
s.send(signal.encode())
response = s.recv(1024).decode()
print("Received response:", response)
s.close()
result
socket 属性与方法总结
属性
- family:套接字的地址族
- socket.AF_INET:IPv4 地址族(默认)
- socket.AF_INET6:IPv6 地址族
- socket.AF_UNIX:UNIX 域套接字(也称为本地套接字)。用于在同一台机器上的进程之间进行通信。
- type:套接字的类型
- socket.SOCK_STREAM:面向连接的 TCP 套接字类型
- socket.SOCK_DGRAM:无连接的 UDP 套接字类型
- socket.SOCK_RAW:原始套接字类型。允许直接访问底层网络协议
- socket.SOCK_SEQPACKET:可靠的连续数据包套接字类型
fileno():返回套接字的文件描述符
timeout:设置套接字操作的超时时间
getsockname():返回套接字的本地地址
getpeername():返回套接字连接的远程地址
方法
socket():创建一个新的套接字对象
bind(address):将套接字绑定到指定的地址
listen(backlog):开始监听连接请求,指定同时允许的最大连接数
accept():接受客户端的连接请求,返回一个新的套接字对象和客户端地址
connect(address):与服务器建立连接
send(data):发送数据到连接的另一端
recv(bufsize):从连接的另一端接收数据
close():关闭套接字连接