Ошибка исправления сокета TypeError: требуется целое число - PullRequest
0 голосов
/ 25 мая 2019

Мне нужно подключиться к инопланетному серверу ('localhost', 10000), затем отправить USER, а затем Alisignal

Но я получаю сообщение об ошибке, означающее, что формат моего .send неверен.Знаете ли вы, что является хорошим способом отправки двух разных строк в одном .send?

import socket
clientsocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect (('localhost', 10000))
clientsocket.send('USER:','aliensignal') 

Traceback (most recent call last):
File "/tmp/usercode.py", line 15, in <module>
clientsocket.send('USER:','aliensignal')
TypeError: an integer is required

Ответы [ 3 ]

0 голосов
/ 25 мая 2019

Документы для socket.send () говорят, что вторыми позиционными аргументами являются int, а не str. Далее говорится, что дополнительную информацию об этом аргументе можно найти в recv (2) руководства по Unix. Вот, по крайней мере, справочная страница Linux для recv (2)

0 голосов
/ 26 мая 2019

send принимает только строки и целочисленные флаги опций, которые обычно не используются. TCP - это просто поток байтов, и нет границ сообщений. Протокол для того, что составляет полное сообщение, должен быть определен. Ваш инопланетный сервер должен быть более конкретным.

Вы можете сделать:

clientsocket.send(b'USER:aliensignal')

но вы также можете сделать следующие варианты. Байты просто вводятся в буфер передачи в том же порядке.

clientsocket.send(b'USE')
clientsocket.send(b'R:a')
clientsocket.send(b'liens')
clientsocket.send(b'ignal')

Итак, как инопланетный сервер узнал, что вы отправили полное сообщение? Вот несколько возможных способов:

  • Закрыть клиентское соединение. Сервер может продолжать чтение байтов, пока recv не вернет 0, что означает, что клиент закрыл соединение.
  • Использовать разделитель. Отправьте символ новой строки \n в конце сообщения. Сервер может читать, пока не найдет новую строку и не узнает, что у него есть полное сообщение. Если он читает после новой строки, он может сохранить избыток как часть следующего входящего сообщения.
  • Отправьте длину в байтах сообщения, затем сообщение. send(b'\x16User:aliensignal') например. Для более длинных сообщений протокол может согласовывать длину и порядковый номер сообщения, например, 32-битная (4 байта) длина с прямым порядком байтов.
0 голосов
/ 25 мая 2019

[Python 3.Docs]: сокет. отправка ( байт [, флаги] ) (необязательно) флаги аргумент должен быть целым числом (обычно вы не должны его использовать, но если вы хотите больше подробностей, проверьте [man7]: RECV (2) ).

Что касается вашего текущего дела, вы можете:

  • Позвонить отправить дважды (один раз для каждого из них):

    clientsocket.send(b"USER:")
    clientsocket.send(b"aliensignal")
    
  • Объединить строки ( байтов ) и отправить их одновременно:

    clientsocket.send(b"USER:aliensignal")
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...