gpt4 book ai didi

Python 套接字从服务器接收到不一致的消息

转载 作者:可可西里 更新时间:2023-11-01 02:43:28 24 4
gpt4 key购买 nike

所以我对网络很陌生,我使用的是 Python Socket库连接到传输位置数据流的服务器。

这里是使用的代码。

import socket

BUFFER_SIZE = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((gump.gatech.edu, 756))

try:
while (1):
data = s.recv(BUFFER_SIZE).decode('utf-8')
print(data)
except KeyboardInterrupt:
s.close()

问题是数据以不一致的形式到达。

大多数时候它以正确的形式到达,如下所示:

2016-01-21 22:40:07,441,-84.404153,33.778685,5,3

然而其他时候它可以像这样分成两行到达:

2016-01-21

22:40:07,404,-84.396004,33.778085,0,0

有趣的是,当我使用 Putty 建立到服务器的原始连接时,我只得到正确的形式,而没有得到拆分。所以我想一定有什么事情在 split 消息。或者 Putty 正在做的事情以始终正确组装它。

我需要的是变量 data 始终包含正确的行。知道如何实现吗?

最佳答案

最好将套接字视为连续的数据流,这些数据可能以点点滴滴或洪水的形式到达。

特别是,接收者的工作是将数据分解成它应该包含的“记录”,套接字不会神奇地知道如何为你做这件事。这里的记录是行,所以你必须自己读取数据并拆分成行。

您不能保证单个 recv 将是一个完整的行。可能是:

  • 只是一行的一部分;
  • 或几行;
  • 或者,很可能是几行和另一部分行。

尝试类似的东西:(未经测试)

# we'll use this to collate partial data
data = ""

while 1:
# receive the next batch of data
data += s.recv(BUFFER_SIZE).decode('utf-8')

# split the data into lines
lines = data.splitlines(keepends=True)

# the last of these may be a part line
full_lines, last_line = lines[:-1], lines[-1]

# print (or do something else!) with the full lines
for l in full_lines:
print(l, end="")

# was the last line received a full line, or just half a line?
if last_line.endswith("\n"):
# print it (or do something else!)
print(last_line, end="")

# and reset our partial data to nothing
data = ""
else:
# reset our partial data to this part line
data = last_line

关于Python 套接字从服务器接收到不一致的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34935857/

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