отправить массив с плавающей точкой через сокет - PullRequest
0 голосов
/ 23 мая 2018

У меня есть простая настройка сокета клиент / сервер, которую я тестирую.Отправка строковых значений с сервера client => легко с помощью:

bytes(my_string, "UTF-8")

Однако теперь, когда я пытаюсь отправить массив чисел (некоторые числа с плавающей запятой), я получаю эту ошибку:

Traceback (most recent call last):
  File "client.py", line 26, in <module>
    main2()
  File "client.py", line 22, in main2
    s.send(bytes(sample))
TypeError: 'float' object cannot be interpreted as an integer

Если я должен отправить байты, каков наилучший способ преобразовать числа с плавающей точкой в ​​байты, а затем обратно в число с плавающей точкой после получения?

Вот клиенткод:

def main2():
    import socket

    s = socket.socket()
    host = socket.gethostname()  # client and server are on same network
    port = 1247
    s.connect((host, port))
    print(s.recv(1024))
    sample = [0.9,120000,0.85,12.8,0.1,28,16,124565,0.72,3.9]
    s.send(bytes(sample))
    print("the message has been sent")

if __name__ == '__main__':
    main2()

И код сервера, на случай, если это имеет значение:

def main2():
    import socket

    s = socket.socket()
    host = socket.gethostname()
    port = 1247
    s.bind((host,port))
    s.listen(5)
    while True:
        try:
            c, addr = s.accept()
            print("Connection accepted from " + repr(addr[1]))
            c.send(bytes("Server approved connection\n", "UTF-8"))
            print(repr(addr[1]) + ": " + str(c.recv(1024)))
            continue
        except (SystemExit, KeyboardInterrupt):
            print("Exiting....")
            c.close()
            break
        except Exception as ex:
            import traceback
            print("Fatal Error...." + str(ex))
            print(traceback.format_exc())
            c.close()
            break

if __name__ == '__main__':
    main2()

1 Ответ

0 голосов
/ 23 мая 2018

struct.pack и struct.unpack упаковывают различные типы данных в потоки байтов:

>>> import struct
>>> sample = [0.9,120000,0.85,12.8,0.1,28,16,124565,0.72,3.9]
>>> data = struct.pack('<10f',*sample)
>>> print(data)
b'fff?\x00`\xeaG\x9a\x99Y?\xcd\xccLA\xcd\xcc\xcc=\x00\x00\xe0A\x00\x00\x80A\x80J\xf3G\xecQ8?\x9a\x99y@'
>>> data = struct.unpack('<10f',data)
>>> data
(0.8999999761581421, 120000.0, 0.8500000238418579, 12.800000190734863, 0.10000000149011612, 28.0, 16.0, 124565.0, 0.7200000286102295, 3.9000000953674316)

В приведенном выше коде <10f означает упаковывать (или распаковывать) десять поплавков с прямым порядком байтов встрока байтов.

Другой вариант - использовать JSON для сериализации объекта списка в строку и кодирования его в строку байтов:

>>> import json
>>> data = json.dumps(sample).encode()
>>> data # byte string
b'[0.9, 120000, 0.85, 12.8, 0.1, 28, 16, 124565, 0.72, 3.9]'
>>> json.loads(data) # back to list of floats
[0.9, 120000, 0.85, 12.8, 0.1, 28, 16, 124565, 0.72, 3.9]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...