2011-08-18 20 views
8

के माध्यम से सरणी भेजना और प्राप्त करना पाइथन का उपयोग करके यूडीपी सॉकेट के माध्यम से एक सरणी भेजना संभव है? मैं पाइथन 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() 

उत्तर

14

eval कुछ पूरी तरह से अलग कर रहा है आप क्या सोचते हैं उससे ज्यादा।

नेटवर्क पर डेटा भेजने के लिए, आपको बाइट्स की एक सरणी, तो deserialize इसे वापस में serialize यह की जरूरत है। अजगर में, सबसे वस्तुओं की क्रमबद्धता pickle मॉड्यूल के माध्यम से किया जा सकता है:

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

Deserialization:

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

यह काम करता है, धन्यवाद! – dawnoflife

3

आप pickle सरणी को आजमा सकते हैं। पिकल पाइथन वस्तुओं को डीकोड करने के लिए एक पायथन लाइब्रेरी है। यह भी बहुत कुछ करने में सक्षम है, लेकिन यह निश्चित रूप से अपने कार्य को पूरा करने के लिए पर्याप्त है: इस पक्ष पर

आप pickle एक स्ट्रिंग के लिए वस्तु:

pickled_string = pickle.dumps(a) 

रिसीवर की ओर आप unpickle वस्तु पर:

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

आप एक सॉकेट के माध्यम से एक अजगर वस्तु भेजने की कोशिश कर रहे हैं, यह सामान्य है कि यह, काम नहीं करता है आप वस्तुओं एक सॉकेट में नहीं भेज सकते हैं, वस्तुओं डेटा नहीं हैं, वे के प्रतिनिधित्व कर रहे हैं किसी दिए गए प्रोग्रामिंग भाषा में कुछ डेटा। आपको डेटा पर अपनी ऑब्जेक्ट का "अनुवाद" करना होगा और ऑब्जेक्ट को अन्य सॉकेट की तरफ से डेटा से फिर से बनाना होगा। ऐसा करने का एक तरीका pickle मॉड्यूल के साथ होगा।

क्लाइंट साइड, आप "अचार" वस्तु पर:

data = pickle.dumps(my_array) 

और सर्वर साइड पर, आप "unpickle" प्राप्त डेटा:

my_array = pickle.loads(received_data) 
+0

मैं केवल 1 उत्तर स्वीकार कर सकता हूं लेकिन आपके उत्तर के लिए धन्यवाद! – dawnoflife

6

मैं व्यक्तिगत रूप से tostring और fromstring निर्मित क्रमबद्धता तरीके हैं many times faster और अचार may not support NaN के बाद से प्रयोग करेंगे , इंफ और अन्य अपरिभाषित मूल्य।

+1

'pickle' numpy arrays भेजने के लिए भयानक है, बिल्कुल भयानक। पिक प्लेटफॉर्म पर निर्भर है, यह संख्यात्मक सरणी भेजने के लिए बेहद अक्षम है और numpy 'tostring' और' fromstring' जैसे मॉड्यूल में वास्तव में अच्छा क्रमबद्ध समर्थन के साथ आता है लेकिन ये कॉपी विधियां हैं। मैंने जो सर्वोत्तम समाधान लागू किए हैं, वे साइथन का उपयोग कर रहे हैं। – lukecampbell

1

यह सवाल पूछा गया है क्योंकि यह सवाल पूछा गया था, लेकिन मैंने सोचा कि यह jsonsocket library साझा करने लायक है। यह सॉकेट पर स्ट्रिंग्स, सूचियों और शब्दकोशों को भेजने में वाकई आसान बनाता है। यह बड़ी मात्रा में डेटा कुशलता से संभाल सकता है। और आपको किसी भी मैनुअल क्रमिकरण/deserialization करने की जरूरत नहीं है। हुड के तहत, यह डेटा को क्लाइंट पर JSON स्ट्रिंग के रूप में क्रमबद्ध करता है, और इसे सर्वर पर deserializes।

+1

यह एक बहुत अच्छी पुस्तकालय है। यह मुझे बहुत समय और मस्तिष्क के प्रयासों को बचाया! – Anton

0

यदि आपको विशेष रूप से यूडीपी की आवश्यकता नहीं है, तो zmqObjectExchanger (https://github.com/ZdenekM/zmq_object_exchanger) आज़माएं। यह टीसीपी पर पाइथन वस्तुओं को स्थानांतरित करने के लिए अचार और zmq लपेटता है।