引自免费微信小程序:皆我百晓生
根据您提供的代码,我注意到可能存在的问题是,在循环里同时调用了 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_data
为 b""
)。然后,我们将接收到的二进制数据分割成多行,并将每一行转换为字符串后放入队列。