Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过套接字发送和接收阵列_Python_Sockets_Udp - Fatal编程技术网

Python 通过套接字发送和接收阵列

Python 通过套接字发送和接收阵列,python,sockets,udp,Python,Sockets,Udp,是否可以使用Python通过UDP套接字发送数组?我正在使用Python2.5并尝试发送一个简单的数组,但它不起作用。它可以成功地发送数组,但当我试图用数组的一项打印它时,程序崩溃了。我不确定错误是什么,因为我采取了将数据转换为数组的预防措施,但它不起作用。希望我能尽可能清楚地解释这个问题。我会感谢你的帮助 # Client program from socket import * import numpy from array import* # Set the socket parame

是否可以使用Python通过UDP套接字发送数组?我正在使用Python2.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()

您可以尝试
pickle
数组。Pickle是一个python库,用于对python对象进行加密和解码。它可以做更多的事情,但绝对足以完成您的任务:

在发送方,您可以
pickle
将对象设置为字符串:

pickled_string = pickle.dumps(a)
在接收器端,您
取消勾选对象:

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

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

在客户端,“pickle”对象:

a = pickle.loads(received_string)
# a is now your sent array
data = pickle.dumps(my_array)
在服务器端,您可以“取消勾选”接收到的数据:

my_array = pickle.loads(received_data)

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])

我个人会使用和
fromstring
,因为内置的序列化方法是和pickle NaN、Inf和其他未定义的值。

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

如果您不特别需要UDP,请尝试zmqObjectExchange()。它包装了pickle和zmq以通过TCP传输python对象。

pickle
对于发送numpy数组非常糟糕,绝对糟糕。Picke依赖于平台,发送numpy数组的效率极低,并且numpy在模块中提供了非常好的序列化支持,如
tostring
fromstring
,但这些都是复制方法。我实现的最好的解决方案是使用Cython。它是一个非常好的库。这节省了我很多时间和脑力劳动!