Я немного разбираюсь в построении сервера сокетов на 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».
Б»является потому, что сокеты производят байт, не строки. Кроме того, попробуйте использовать nc вместо telnet, чтобы не иметь дело с дополнительными байтами, которые добавляет telnet-протокол. –
Хорошо, но у меня метод recv из сокета вернул строку? Как я могу заставить предложение быть только напечатанным в строке, поэтому я могу сравнить его с «привет»? – Peter
Спасибо, я попробую сейчас – Peter