yyxtb2 2024-04-15 16:36 采纳率: 0%
浏览 5

python在处理tcp实时数据流时遇到的问题

我希望处理一个tcp实时数据流,客户端通过返回testtest获取数据,数据量比较大。在处理的时候,数据无法输出,有哪位可以解答吗?
部分代码如下:


```python
import socket
import queue

aisaddr = ('192.168.128.1', 8000)
s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
s.connect(aisaddr)
s.send('testtest'.encode())
aisdata = s.recv(1024).split("\n")
q = queue.Queue()
for data in aisdata:
    q.put(data)
    print(q.get())



![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/97edf12e50d8462da06a24b9263a858a.png "#left")

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-15 16:36
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的代码,我注意到可能存在的问题是,在循环里同时调用了 q.put()q.get()。这会导致队列在读取之前就被写入了新的数据,从而可能会覆盖掉之前的元素。要解决这个问题,您可以将 print(q.get()) 移到循环外部,确保每次只从队列中取出并打印一条数据。

    修改后的代码如下:

    import socket
    import queue
    
    aisaddr = ('192.168.128.1', 8000)
    s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    s.connect(aisaddr)
    s.send('testtest'.encode())
    aisdata = s.recv(1024).split("\n")
    q = queue.Queue()
    
    # 将数据放入队列
    for data in aisdata:
        q.put(data)
    
    # 逐个从队列中取出并打印数据
    while not q.empty():
        print(q.get())
    

    这段代码首先创建了一个队列,并将接收到的数据放入队列。然后在一个 while 循环中,当队列不为空时,它会从队列中取出并打印一条数据。这样就不会因为同时进行 put 和 get 操作而丢失数据了。

    如果您的数据流非常大,一次性接收1024字节可能不足以包含所有数据,您可能需要在循环中不断接收直到没有更多数据。下面是一个示例,使用一个标志来判断是否还有更多的数据需要接收:

    import socket
    import queue
    
    aisaddr = ('192.168.128.1', 8000)
    s = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
    s.connect(aisaddr)
    s.send('testtest'.encode())
    aisdata = b""
    more_data = True
    
    while more_data:
        new_data = s.recv(1024)
        if not new_data:
            more_data = False
        else:
            aisdata += new_data
    
    lines = aisdata.split(b"\n")
    q = queue.Queue()
    
    # 将数据放入队列
    for line in lines:
        q.put(line.decode("utf-8"))
    
    # 逐个从队列中取出并打印数据
    while not q.empty():
        print(q.get())
    

    这个版本的代码会持续接收数据,直到服务器没有更多数据发送(new_datab"")。然后,我们将接收到的二进制数据分割成多行,并将每一行转换为字符串后放入队列。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月15日

悬赏问题

  • ¥30 为什么会失败呢,该如何调整
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析