Как отправить произвольные объекты с помощью socket.send ()? - PullRequest
0 голосов
/ 08 июня 2018

У меня очень простой TCP-сервер в Python 3.6, и я хотел бы использовать его для отправки произвольных объектов.

Я могу отправить простой список с этим кодом:

myList = [99, 88]
current_connection.send(bytes(myList))

Однако этот код завершается ошибкой с исключением 'dict' object cannot be interpreted as an integer.

myList = [99,88,{'a': 3},77]
current_connection.send(bytes(myList))

Как я могуотправить это list, которое содержит tuple?

Я также хотел бы отправить пользовательский объект, подобный этому:

myObject = customObject()
current_connection.send(bytes(myObject))

Однако этот код вызывает исключение cannot convert 'customObject' object to bytes.Как правильно отправить пользовательский объект?

Есть ли метод, который я должен использовать, кроме socket.send ()?

Вот полный код:

import socket

def listen():
    connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connection.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    connection.bind(('localhost', 5555))
    connection.listen(10)
    while True:
        current_connection, address = connection.accept()
        while True:
            data = current_connection.recv(2048)
            try:
                #myList = [99,88,{'a': 3},77]
                myList = [99, 88]
                current_connection.send(bytes(myList))
            except Exception as e:
                print(e)
            print(data)

if __name__ == "__main__":
    try:
        listen()
    except KeyboardInterrupt:
        pass
    print('done')

Если send() не может сделать то, что я описал, есть ли более эффективный способ отправки данных?

1 Ответ

0 голосов
/ 08 июня 2018

Почему бы вам сначала не преобразовать свой список в json и передать через сокет, например:

myList = [99,88,{'a': 3},77]
current_connection.send(json.dumps(myList).encode())

На приемнике

myList = json.loads(received_bytes.decode())

Я также хотел бы отправитьпользовательский объект, подобный этому:

Существует два решения

  1. Самый простой это pickle.dumps (your_obj).
  2. Напишите сериализатор json для вашего объекта.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...