簡體   English   中英

通過套接字發送和接收數組

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

我個人會使用tostringfromstring因為內置的序列化方法要快很多倍,而pickle 可能不支持 NaN,Inf和其他未定義的值。

你試圖通過套接字發送一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM