[英]Sending and Receiving arrays via Sockets
是否可以使用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()
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])
你試圖通過套接字發送一個python對象,它是不正常的,你不能在套接字中發送對象,對象不是數據,它們是給定編程語言中某些數據的表示是正常的。 您需要將對象“轉換”為數據,並從另一個套接字的數據重新創建對象。 一種方法是使用pickle
模塊。
在客戶端,你“挑選”對象:
data = pickle.dumps(my_array)
在服務器端,您“取消”收到的數據:
my_array = pickle.loads(received_data)
你可以嘗試pickle
陣列。 Pickle是一個用於編碼和解碼python對象的python庫。 它能夠做得更多,但它絕對足以完成你的任務:
在發送方,您將對象pickle
為字符串:
pickled_string = pickle.dumps(a)
在接收器端你unpickle
對象:
a = pickle.loads(received_string)
# a is now your sent array
自問這個問題以來已經有一段時間了,但我認為值得分享jsonsocket
庫 。 它使得通過套接字發送字符串,列表和字典變得非常容易。 它可以有效地處理大量數據。 而且您不需要進行任何手動序列化/反序列化。 在引擎蓋下,它將數據序列化為客戶端上的JSON字符串,並在服務器上對其進行反序列化。
如果您不需要UDP,請嘗試使用zmqObjectExchanger( https://github.com/ZdenekM/zmq_object_exchanger )。 它包裝pickle和zmq以通過TCP傳輸python對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.