如何在Python中通过TCP套接字发送大型数组?可能吗?

-4 投票
2 回答
2499 浏览
提问于 2025-04-18 11:01

我没有可以展示的例子。我查了一些网上的资料,但没有找到符合我需求的东西。请大家给我一个可以使用的例子。

2 个回答

0

你可以在python wiki上找到一个简单的示例,教你怎么做到这一点。

为了让你更清楚,我把上面提到的网站上的代码复制过来了。首先,你需要创建一个服务器:

#!/usr/bin/env python

import socket


TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 20  # Normally 1024, but we want fast response

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()
print 'Connection address:', addr
while 1:
data = conn.recv(BUFFER_SIZE)
     if not data: break
     print "received data:", data
     conn.send(data)  # echo
 conn.close()

然后,你需要创建一个客户端:

#!/usr/bin/env python

import socket


TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 1024
MESSAGE = "Hello, World!"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()

print "received data:", data
2

有很多种选择。我建议你试试:

  • 与其使用一个很大的数组,不如试试生成器或迭代器,这样可以一个一个地提供数据。这可以在发送过程中节省内存(不过如果你能接受把整个数组都放在内存里,那就没必要这么做)。
  • 不要使用普通的套接字,改用ZeroMQ(它是在普通套接字之上运行的)。
  • 为发送数组定义一个协议。假设这个数组是简单的,可以用以下几种消息类型:
    • startarray(开始数组)
    • itemdata(数据项)
    • endarray(结束数组)
  • 循环遍历要发送的项,逐个发送。在发送“startarray”消息之前,先发送这个消息,然后一个一个地发送数据项,最后用“endarray”消息结束。
  • 在TCP传输时,你需要选择一种序列化格式。我建议从JSON开始。
  • 发送方可以使用类型为PUSH的ZMQ套接字,接收方则使用PULL。

撰写回答