python sokcet编程中清空socket缓冲区
服务器端代码
import json
import socket
import socketserver
import struct
import time
import numpy as np
class MyServer(socketserver.BaseRequestHandler):
def handle(self):
conn :socket.socket= self.request
step= 0
for i in range(3):
conn.send(json.dumps({"step": f'{step}'}).encode())
step+= 1
time.sleep(3)
while True:
a = np.arange(10, dtype=np.int).tobytes()
size = len(a)
print(f"发送size: {size}", struct.pack('i', size))
conn.sendall(struct.pack('i', size))
conn.sendall(a)
time.sleep(1)
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 9999), MyServer)
print("启动socketserver服务器!")
server.serve_forever()
客户端代码
import socket
import struct
import numpy as np
import select
def clearSocketBuffer(conn:socket.socket):
while True:
ready = select.select([conn], [], [], timeout_in_seconds)
if ready[0]:
data = conn.recv(4)
print("清空数据:", data)
else:
print('超时清空')
return
ip_port = ('127.0.0.1', 9999)
sk = socket.socket()
sk.connect(ip_port)
sk.setblocking(False)
timeout_in_seconds = 0.5
clearSocketBuffer(sk)
sk.setblocking(True)
while True:
data = sk.recv(4)
size = struct.unpack('i', data)[0]
print("接收数据大小:", size)
data = sk.recv(size)
print("数据:", np.frombuffer(data, dtype=np.int))
结果
清空数据: b'{"st'
清空数据: b'ep":'
清空数据: b' "0"'
清空数据: b'}{"s'
清空数据: b'tep"'
清空数据: b': "1'
清空数据: b'"}{"'
清空数据: b'step'
清空数据: b'": "'
清空数据: b'2"}'
超时清空
接收数据大小: 40
数据: [0 1 2 3 4 5 6 7 8 9]
接收数据大小: 40
数据: [0 1 2 3 4 5 6 7 8 9]
Process finished with exit code -1