小编典典

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

python

是否可以使用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()

阅读 135

收藏
2021-01-20

共1个答案

小编典典

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])
2021-01-20