2015-09-12 3 views
0

Итак, я пытаюсь отправить массив по сокетам. Массив - это ось джойстика, так что x, y, z, слайдер.Попытка отправить массив поверх сокета

Итак я отправить его через сокет один раз, и я получаю его на другом конце, а затем unpickle его там, где я получаю ошибку

Это дает мне ошибку _pickle.UnpicklingError: unpickling stack underflow им не совсем уверен, что это значит, но у меня есть прочитайте это потому, что массив отключается. Client (Использует Pygame, чтобы ось джойстика)

x = j.get_axis(0) 
    y = j.get_axis(1) 
    slide = j.get_axis(2) 
    z = j.get_axis(3) 
    array = (x, y, slide, z) 
    send_array = pickle.dumps(array) 

и просто отправить массив с socket.send(send_array) , а затем я получаю и попробуйте распечатать его для целей тестирования.

 raw_message = sc.recv(1024) 
     (data1, data2, data3, data4) = pickle.loads(raw_message) 
     print (data1) 

Благодаря

ответ

1

Клиент:

import socket, pickle 

HOST = 'localhost' 
PORT = 50007 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
arr = (YOUR ARRAY) 
data_string = pickle.dumps(arr) 
s.send(data_string) 

data = s.recv(4096) 
data_arr = pickle.loads(data) 
s.close() 
print 'Received', repr(data_arr) 

Сервер:

import socket 

HOST = 'localhost' 
PORT = 50007 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) 
conn, addr = s.accept() 
print 'Connected by', addr 
while 1: 
    data = conn.recv(4096) 
    if not data: break 
    conn.send(data) 
conn.close() 
+0

Я использую переменную '= pickle.loads (извлекаться сообщение)', но он по-прежнему дает мне ошибка – ferret249

+0

Данные Ok теряются где-то в отправке через сокет – ferret249

+0

, вероятно, в том, что e 1 ... вместо этого он должен отправить какой-то терминальный подострый ... (который не может быть в рассоле идеально '\ x00 \ x01' или что-то в этом роде), а затем дождаться этого, а не просто ругаться, как только вы ничего не получите. .. просто догадка ... это похоже на вероятную точку отказа ... также использовать контрольные суммы или что-то или использовать протокол подтверждения связи, например TCP (lathoughh, если его просто локальный он действительно не должен терять пакеты ...) –