Python套接字服务器:无法比较来自客户端的输入

时间:2017-02-04 12:31:51

标签: python-3.x sockets server

我在python上构建套接字服务器时做了一点点练习。我目前在我的linux mint系统上本地运行它,并使用telnet localhost 20000进行测试。

这个想法非常简单。现在,我希望客户(我自己)发送一个"你好"消息到服务器,服务器在服务器上回复另一个"你好"信息。然后,客户端可以发送服务器没有响应的任何消息,直到客户端说出“#e;"”。然后服务器用另一个" 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,因为我输入"你好"消息,但我不清楚为什么b'并且\ r出现。

你知道这里的问题是什么以及如何解决它吗?关于堆栈溢出的其他示例,字符串比较工作正常,所以我无法弄清楚它为什么不适合我。

提前致谢!

更新的 我现在使用nc而不是telnet,并将connectionSocket.recv(1024)的每次出现都更改为str(connectionSocket.recv(1024),' utf-8')。服务器现在获取正确的字符串,但它仍然没有回显"你好"回到我身边,当我输入" bye"。

时,它也不会关闭套接字

1 个答案:

答案 0 :(得分:1)

使用netcat而不是telnet来避免telnet协议字节。 像这样:newValue然后键入你的输入。

此外,套接字I / O在Python 3中始终是字节,例如,请参阅https://docs.python.org/3/library/socket.html#socket.socket.recv所以你必须与nc localhost 20000进行比较(或首先将字节解码为字符串)