отправка списка через UDP - PullRequest
       47

отправка списка через UDP

0 голосов
/ 08 декабря 2018

Я использую программирование сокетов для отправки текстового сообщения UDP, и оно работает нормально.Вот код:

отправить:

import socket
UDP_IP = "10.0.0.2"
UDP_PORT = 5005
MESSAGE = "Hello"
print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

recv:

import socket

UDP_IP = "10.0.0.2"
UDP_PORT = 5005
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
  data, addr = sock.recvfrom(1024)
  print "received message:", data

Теперь я хочу изменитьсообщение, которое я отправляю в список.Я попытался сделать это с помощью pickle.Вот код:

отправить:

import socket
import pickle

UDP_IP = "10.0.0.2"
UDP_PORT = 5005
a = []
a.append('H')
a.append('G')
MESSAGE = pickle.dumps(a)
print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

recv:

import socket
import pickle

UDP_IP = "10.0.0.2"
UDP_PORT = 5005

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
  data, addr = sock.recvfrom(1024)
  print "received message:", data
  pickle.loads(data)
  print(data)

Но я неполучение правильной формы списка на стороне получателя.Вот вывод:

(1p0
S'H'
p1
aS'G'
p2
a.

(1p0
S'H'
p1
aS'G'
p2
a.

что не так?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Проблема решена.Код работает нормально, возникла проблема, потому что я печатал сами данные, а не вывод pickle.loads(data), поэтому этот код теперь работает нормально:

recv:

import socket
import pickle

UDP_IP = "10.0.0.2"
UDP_PORT = 5005

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
while True:
  data, addr = sock.recvfrom(1024)
  print "received message:", data
  print(pickle.loads(data))
0 голосов
/ 08 декабря 2018

Сокеты работают с байтами (двоичные данные).
Кодируют вашу строку при отправке данных в соединение с сокетом (str.encode())
и декодируют последовательность байтов, полученную из сокета, с помощью bytes.decode('utf8').

https://docs.python.org/3/howto/sockets.html#socket-howto

...