2017-02-04 3 views
1

Я немного разбираюсь в построении сервера сокетов на python. В настоящее время я запускаю его локально на моей системе монетного двора Linux и тестирую его с помощью telnet localhost 20000.Сервер сокета Python: не может сравнивать ввод с клиента

Идея довольно проста. На данный момент я хочу, чтобы клиент (я) отправил сообщение «привет» на сервер, на котором сервер отвечает назад с другим сообщением «привет». Затем клиент может отправить любое сообщение, на котором сервер не отвечает, пока клиент не скажет «пока». Затем сервер отвечает другим «bye», и сокет закрыт.

Я реализовал это следующим образом (в Python 3):

1 from socket import * 
    2 serverPort = 20000 
    3 serverSocket = socket(AF_INET, SOCK_STREAM) 
    4 serverSocket.bind(('', serverPort)) 
    5 serverSocket.listen(1) 
    6 
    7 print('The echo server is ready to receive') 
    8 while 1: 
    9  connectionSocket, addr = serverSocket.accept() 
10  print('Processing client ', addr) 
11  sentence = "" 
12 
13  try: 
14   sentence = connectionSocket.recv(1024) 
15   while sentence != "hello": 
16    sentence = connectionSocket.recv(1024) 
17   connectionSocket.send("hello") 
18 
19   sentence = connectionSocket.recv(1024) 
20   while sentence != "bye": 
21    sentence = connectionSocket.recv(1024) 
22   connectionSocket.send("bye") 
23  except error: 
24   pass 
25 
26  print('Client closed ', addr) 
27  connectionSocket.close() 

Это очень простая программа, в которой я не могу найти какой-либо ошибки, поэтому я был очень удивлен, увидев, что не работает , Когда я набираю «привет» после запуска сервера с python3 server.py и устанавливая пробой подключения telnet localhost 20000, я просто не получаю ответа. Сначала я подумал, что проблема заключается в тесте равенства в строке 15, поэтому я проверил несколько вещей с отпечатками, а вместо «привет» Сообщение, полученное сервером, было: b'hello \ r \ n. Я понимаю \ n, потому что я набираю Enter после сообщения «hello», но мне непонятно, почему появляются b 'и the \ r.

Знаете ли вы, в чем проблема, и как я могу это исправить? В других примерах переполнения стека сравнение строк просто отлично работает, поэтому я не могу понять, почему он не работает для меня.

Заранее благодарен!

Update: Я использую Nc теперь вместо телнет, и изменил все вхождения connectionSocket.recv (1024) в ул (connectionSocket.recv (1024), 'UTF-8'). Теперь сервер получает правильную строку, но он по-прежнему не возвращает «привет» мне и не закрывает сокет, когда я набираю «bye».

+1

Б»является потому, что сокеты производят байт, не строки. Кроме того, попробуйте использовать nc вместо telnet, чтобы не иметь дело с дополнительными байтами, которые добавляет telnet-протокол. –

+0

Хорошо, но у меня метод recv из сокета вернул строку? Как я могу заставить предложение быть только напечатанным в строке, поэтому я могу сравнить его с «привет»? – Peter

+0

Спасибо, я попробую сейчас – Peter

ответ

1

Используйте netcat вместо telnet, чтобы избежать байтов протокола telnet. Нравится это: nc localhost 20000 и введите ваш ввод.

Кроме того, разъем ввода/вывода всегда байт в Python 3, например, см https://docs.python.org/3/library/socket.html#socket.socket.recv Таким образом, вы должны сравнить с b'hello' (или декодировать байты в строку первого)

+0

Спасибо, но он все еще не работает. Теперь я использую nc и изменяю каждое появление connectionSocket.recv (1024) на str (connectionSocket.recv (1024), 'utf-8'). Теперь сервер получает правильную строку, но он по-прежнему не возвращает «привет» мне и не останавливается, когда я набираю «bye». – Peter

+1

Вы отлаживали его вообще? Либо поставьте точку останова на линии (линии) сразу после sock.recv() или распечатайте то, что вы получили там. Вы увидите, что (если вы используете ручной ввод через netcat!), Полученные байты будут '' 'hello \ n''', которые все еще содержат новую строку, которую вы ввели в консоль netcat. Может быть, вам легче, если вы используете '' sock.makefile() '' и читаете материал из него, как если бы это был обычный файл? Вместо того, чтобы иметь дело с необработанными вызовами recv –

+0

Спасибо! Я решил это! Я принял ваш ответ. Понравилось бы это, если бы вы могли изменить вопрос: – Peter