gpt4 book ai didi

Python 套接字服务器接收重复数据

转载 作者:行者123 更新时间:2023-11-28 17:42:35 25 4
gpt4 key购买 nike

我有一个运行服务器的树莓派,该服务器与我笔记本电脑上的服务器进行通信。我已经通过 python 上的简单套接字连接完成了此操作。

像这样:

服务器

HOST = "192.168.0.115"
PORT = 5001
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST,PORT))
s.listen(1)

conn, addr = s.accept()
while conn:
data = conn.recv(1024)
print data
if not data:
break
conn.close()

客户

__init__(self,addr,port,timeout):
self.addr = addr
self.port = port
self.timeout = timeout
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.addr,self.port))

#in a different file the call to send is made, passes list object as a parameter

send(self,data):
if self.socket:
self.socket.send(str(data))

在客户端代码中设置打印语句会产生 (x,y,z),这是预期的输出。但是,在服务器上接收到数据后,它会以一种模式出现:

(x,y,z)(x,y,z)
(x,y,z)
(x,y,z)
(x,y,z)(x,y,z)
...

为什么收到的数据是重复的?它是 TCP 的属性吗?如果是这样,我该如何解决这个问题,以便像我最初那样将数据作为一个发送的字符串接收。

最佳答案

TCP 以流的形式发送数据。您可以将数据写入该流,也可以从该流接收数据。重要的是,虽然它可以是一个发送对应一个接收的情况,但并不能保证一定是这种情况。您可以发送一个大块并在一堆较小的 block 中接收它,或者您可以发送一堆较小的 block 并接收一个大块,或介于两者之间的任何东西。你属于后一种情况。

要解决这个问题,您需要在 TCP 之上添加某种成帧协议(protocol)。您可以通过两种主要方式执行此操作:

  1. 在每条消息前加上消息的长度,然后读取那么多字节。

  2. 在每条消息之间放置一个分隔符。

出于您的目的(发送不带换行符的纯文本),后者以换行符作为分隔符可能没问题。您可能会想出如何做到这一点,但本质上是重复这样做:

  1. 接收一些数据。
  2. 将该数据附加到缓冲区。
  3. 搜索换行符并处理到该点为止的缓冲区。重复此步骤,直到不再有换行符。

如果您所做的只是打印,您可以通过循环替换所有这些,从套接字接收然后写入 stdout

关于Python 套接字服务器接收重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22277305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com