2011-08-18 32 views
8

Python'u kullanarak UDP Yuvaları aracılığıyla bir dizi göndermek mümkün mü? Python 2.5 kullanıyorum ve basit bir dizi göndermeye çalışıyorum ama çalışmıyor. Diziyi başarıyla gönderebilir ancak dizinin bir öğesiyle yazdırmaya çalıştığımda program çöküyor. Verileri bir diziye dönüştürme önlemini aldığımdan hatanın ne olduğundan emin değilim, ancak çalışmıyor. Umarım problemi olabildiğince açık bir şekilde açıkladım. Yardımın için minnettar olurum!Soketler üzerinden diziler gönderme ve alma

# 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() 

cevap

14

eval tamamen farklı bir şey yapıyor:

data = pickle.dumps(my_array) 

Ve sunucu tarafında, sen "unpickle" alınan veri

düşündüğünden daha iyi.

ağ üzerinden veri göndermek için, bir bayt dizisi, ardından serisini geri onu içine serialize bunu gerekir.

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

Seri kaldırma:

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

Bu eser, Teşekkürler! – dawnoflife

3

Diziyi pickle deneyebilirsiniz. Pickle, python nesnelerini kodlamak ve çözmek için bir python kütüphanesidir. Çok daha fazlasını yapmak mümkün, ama kesinlikle görevi yerine getirmek için yeterlidir: gönderici tarafında

Eğer pickle bir dizeye nesne:

pickled_string = pickle.dumps(a) 

alıcı tarafında sen unpickle nesne üzerinde: bir soket üzerinden bir piton nesnesi göndermek için çalışıyoruz

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

, bunların temsili olan nesneler veri değildir, bu, işe yaramaz bir soket nesneleri gönderemezsiniz normaldir Belirli bir programlama dilinde bazı veriler. Nesnenizi veriye "çevirmeniz" ve nesneyi diğer soket tarafındaki verilerden yeniden oluşturmanız gerekir. Bunu yapmanın bir yolu, pickle modülü ile olacaktır. istemci tarafında, sen "turşu" nesne üzerinde

:

my_array = pickle.loads(received_data) 
+0

Sadece 1 cevabı kabul edebilirim ama cevabınız için teşekkür ederim! – dawnoflife

6

Ben şahsen many times faster seri yöntemlerinde olduğu dahili ve turşu may not support NaN beri tostring ve fromstring kullanmak Python, çoğu nesnelerin seri pickle modülü üzerinden yapılabilir , Inf ve diğer tanımsız değerler.

+1

'pickle', numpy dizileri göndermek için korkunç, kesinlikle korkunç. Picke platform bağımlı, numpy dizileri göndermek için son derece verimsiz ve numpy 'tostring' ve' fromstring' gibi modülde gerçekten iyi serileştirme desteği ile geliyor ama bunlar kopya yöntemleri. Uyguladığım en iyi çözümler Cython'u kullanıyor. – lukecampbell

1

Bu soruyu sorduğundan beri bir süre geçti, ancak jsonsocket library'u paylaşmaya değer olduğunu düşündüm. Soketler üzerinden dizeleri, listeleri ve sözlükleri göndermeyi gerçekten kolaylaştırır. Büyük miktarda veriyi verimli bir şekilde ele alabilir. Ve herhangi bir manuel serileştirme/serileştirme yapmanıza gerek yoktur. Kaputun altında, verileri istemcideki JSON dizeleri olarak serileştirir ve sunucuda seri hale getirir.

+1

Çok iyi bir kütüphanedir. Bu bana çok zaman kazandı ve beyin çabaları! – Anton

İlgili konular