如何在Python中通过TCP套接字发送大型数组?可能吗?
我没有可以展示的例子。我查了一些网上的资料,但没有找到符合我需求的东西。请大家给我一个可以使用的例子。
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。