Клиент сокета Python к серверу сокета Java - PullRequest
0 голосов
/ 02 ноября 2009

У меня есть сервер сокетов Java, который ожидает ровно n байтов от некоторого порта. Я хочу написать клиенты Python, которые просто отправляют байты через какой-то порт на сервер Java.

Так как в Python нет примитивов, я не уверен, что отправлю точно n байтов. Есть предложения?

Подробнее:

У меня есть Java DatagramSocket, который принимает n байтов:

DatagramPacket dp = new DatagramPacket(new byte[n], n);

Ответы [ 3 ]

1 голос
/ 02 ноября 2009

Если вы используете сокет дейтаграммы (например, протокол UDP по IP), Socket API гарантирует, что если ваш n меньше максимального размера полезной нагрузки, ваши данные будут отправлены в один пакет. Поэтому достаточно просто позвонить socket.send.

Самый простой способ отправки данных через сокет stream - это использование метода socket.sendall, так как send для потоков не гарантирует, что все данные действительно отправлены (и вам следует повторно позвоните send, чтобы передать все имеющиеся у вас данные). Вот пример:

>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(('localhost', 12345))
>>> data = 'your data of length n'
>>> s.sendall(data)

Как уже упоминал @Alex, в Python нет ничего общего с какими-то "примитивами". Это как раз и проблема с Socket API.

1 голос
/ 02 ноября 2009

somesocket.send принимает аргумент байтовой строки s - просто убедитесь, что len(s) == n, и вы будете отправлять точно n байт. При чем тут «примитивы»?

Чтобы превратить произвольные группы данных в байтовые строки (и обратно), см. Модуль struct в стандартной библиотеке Python (для конкретного, но частого случая однородных массивов простых типов, таких как float, 1011 * массив модуль часто даже лучше).

0 голосов
/ 02 ноября 2009

Благодаря вашим ответам я разобрался в том, что искал. То, что я хотел, было struct.unpack и struct.pack, чтобы позволить мне упаковать python float 1.2345 в строковое представление типа double.

То есть:

>>> struct.pack('d', 1.2345)
'\x8d\x97n\x12\x83\xc0\xf3?'
>>> struct.unpack('d', struct.pack('d', 1.2345))[0]
1.2344999999999999

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...