Python Socket编程中清空缓冲区的问题

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         # request里封装了所有请求的数据
		# 模拟需要清空客户端清空的数据
        step= 0
        for i in range(3):
            # time.sleep(0.5)
            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__':
    # 创建一个多线程TCP服务器
    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) # 需要先设置为非阻塞, 使用select超时机制清空
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
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值