要保持TCP套接字连接的活跃并进行读写协调,可以使用以下方法:
方法1:使用select函数
import select
import socket
# 创建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8888))
sock.listen(5)
# 监听套接字和已连接套接字列表
inputs = [sock]
outputs = []
while True:
# 使用select函数检查套接字状态
readable, writable, exceptional = select.select(inputs, outputs, inputs)
for s in readable:
if s is sock:
# 有新的连接请求
conn, address = s.accept()
inputs.append(conn)
else:
# 有数据可读取
data = s.recv(1024)
if data:
# 处理接收到的数据
print("Received:", data)
if s not in outputs:
outputs.append(s)
else:
# 连接已关闭
if s in outputs:
outputs.remove(s)
inputs.remove(s)
s.close()
for s in writable:
# 有数据可发送
s.sendall("Hello, client!".encode())
outputs.remove(s)
for s in exceptional:
# 出现异常
inputs.remove(s)
if s in outputs:
outputs.remove(s)
s.close()
方法2:使用线程或协程
import socket
import threading
# 处理连接请求的线程
def handle_connection(conn):
while True:
data = conn.recv(1024)
if data:
# 处理接收到的数据
print("Received:", data)
conn.sendall("Hello, client!".encode())
else:
break
conn.close()
# 创建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8888))
sock.listen(5)
while True:
# 接受连接请求
conn, address = sock.accept()
# 创建新的线程来处理连接
threading.Thread(target=handle_connection, args=(conn,)).start()
方法3:使用异步框架(如asyncio)
import asyncio
# 处理连接的协程
async def handle_connection(reader, writer):
while True:
data = await reader.read(1024)
if data:
# 处理接收到的数据
print("Received:", data.decode())
writer.write("Hello, client!".encode())
await writer.drain()
else:
break
writer.close()
# 创建TCP服务器
async def main():
server = await asyncio.start_server(
handle_connection, 'localhost', 8888)
async with server:
await server.serve_forever()
asyncio.run(main())
以上是三种常用的保持TCP套接字连接活跃和进行读写协调的方法。具体选择哪种方法取决于你的需求和使用场景。