通过套接字发送和接收数组

时间:2011-08-18 12:00:52

标签: python sockets udp

是否可以使用Python通过UDP套接字发送数组?我正在使用Python 2.5并尝试发送一个简单的数组,但它不起作用。它可以成功发送数组,但是当我尝试使用数组项打印它时,程序崩溃了。我不确定错误是什么,因为我采取了将数据转换为数组的预防措施,但它不起作用。希望我尽可能清楚地解释问题。我很感激你的帮助!

# Client program

from socket import *
import numpy
from array import*

# Set the socket parameters
host = "localhost"
port = 21567
buf = 4096
addr = (host,port)

# Create socket
UDPSock = socket(AF_INET,SOCK_DGRAM)

def_msg = "===Enter message to send to server===";
print "\n",def_msg
a = array('i',[1,3,2])
# Send messages
while (1):
    data = raw_input('yes or now')
    if data!= "yes":
        break
    else:
        if(UDPSock.sendto(a,addr)):
            print "Sending message"

# Close socket
UDPSock.close()



# Server program

from socket import *

# Set the socket parameters
host = "localhost"
port = 21567
buf = 4096
addr = (host,port)

# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

# Receive messages
while 1:
    data,addr = UDPSock.recvfrom(buf)
    L = eval(data)
    if not data:
        print "Client has exited!"
        break
    else:
        print "\nReceived message '", L[1],"'"

# Close socket
UDPSock.close()

6 个答案:

答案 0 :(得分:14)

eval正在做的事与你想的完全不同。

要通过网络发送数据,您需要序列化成一个字节数组,然后反序列化它。在Python中,大多数对象的序列化可以通过pickle模块完成:

if (UDPSock.sendto( pickle.dumps(a), addr)):

反序列化:

data,addr = UDPSock.recvfrom(buf)
L = pickle.loads(data)
print repr(L) # prints array('i', [1, 3, 2])

答案 1 :(得分:6)

我个人会使用tostringfromstring,因为内置的序列化方法是many times faster和pickle may not support NaN,Inf和其他未定义的值。

答案 2 :(得分:4)

你试图通过套接字发送一个python对象,它是不正常的,你不能在套接字中发送对象,对象不是数据,它们是一些数据的表示给定编程语言。您需要将对象“转换”为数据,并从另一个套接字的数据重新创建对象。一种方法是使用pickle模块。

在客户端,你“挑选”对象:

data = pickle.dumps(my_array)

在服务器端,您“取消”收到的数据:

my_array = pickle.loads(received_data)

答案 3 :(得分:3)

您可以尝试pickle数组。 Pickle是一个用于编码和解码python对象的python库。它能够做得更多,但它绝对足以完成你的任务:

在发件人方面,您pickle将对象转换为字符串:

pickled_string = pickle.dumps(a)

在接收方,你unpickle对象:

a = pickle.loads(received_string)
# a is now your sent array

答案 4 :(得分:1)

自问这个问题以来已经有一段时间了,但我认为值得分享jsonsocket library。它使得通过套接字发送字符串,列表和字典变得非常容易。它可以有效地处理大量数据。而且您不需要进行任何手动序列化/反序列化。在引擎盖下,它将数据序列化为客户端上的JSON字符串,并在服务器上对其进行反序列化。

答案 5 :(得分:0)

如果您不需要专门使用UDP,请尝试使用zmqObjectExchanger(https://github.com/ZdenekM/zmq_object_exchanger)。它包装pickle和zmq以通过TCP传输python对象。