Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python套接字服务器:can';t比较来自客户端的输入_Python 3.x_Sockets_Server - Fatal编程技术网

Python 3.x Python套接字服务器:can';t比较来自客户端的输入

Python 3.x Python套接字服务器:can';t比较来自客户端的输入,python-3.x,sockets,server,Python 3.x,Sockets,Server,我正在练习在python上构建套接字服务器。我目前正在linux mint系统上本地运行它,并使用telnet localhost 20000测试它 这个想法很简单。现在,我希望客户机(我自己)向服务器发送一条“hello”消息,服务器在服务器上以另一条“hello”消息进行响应。然后,客户端可以发送服务器没有响应的任何消息,直到客户端说“再见”。然后服务器以另一个“再见”响应,套接字关闭 我通过以下方式实现了这一点(在python 3中): 这是一个非常简单的程序,在其中我找不到任何bug,所

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

这个想法很简单。现在,我希望客户机(我自己)向服务器发送一条“hello”消息,服务器在服务器上以另一条“hello”消息进行响应。然后,客户端可以发送服务器没有响应的任何消息,直到客户端说“再见”。然后服务器以另一个“再见”响应,套接字关闭

我通过以下方式实现了这一点(在python 3中):

这是一个非常简单的程序,在其中我找不到任何bug,所以我很惊讶地发现它不起作用。在使用
python3 server.py运行服务器并通过
telnet localhost 20000
建立连接后键入“hello”时,我没有得到任何响应。我首先认为问题在于第15行的相等性测试,因此我使用打印测试了一些内容,服务器接收到的消息不是“hello”,而是:b'hello\r\n。我理解\n,因为我在“hello”消息后键入Enter,但我不清楚为什么会出现b'和\r

你知道这里有什么问题吗?我怎么解决?在stack overflow的其他示例中,字符串比较很好地工作,所以我不明白为什么它对我不起作用

提前谢谢

更新:
我现在使用nc而不是telnet,并将connectionSocket.recv(1024)的每次出现都更改为str(connectionSocket.recv(1024),'utf-8')。服务器现在获得了正确的字符串,但它仍然不会向我回显“hello”,也不会在我键入“bye”时关闭套接字。

使用netcat而不是telnet来避免telnet协议字节。 如下所示:
nclocalhost 20000
,然后键入您的输入


此外,在Python3中,套接字I/O始终是字节,例如,请参见,因此您必须与
b'hello'
进行比较(或者先将字节解码为字符串)

b'是因为套接字生成字节,而不是字符串。另外,尝试使用nc而不是telnet来避免处理telnet协议添加的额外字节。好的,但是我认为来自套接字的recv方法返回了一个字符串?我怎样才能使句子只成为键入的字符串,这样我就可以将它与“hello”进行比较?谢谢,我现在就试试。谢谢,但它仍然不起作用。我现在使用nc,并将connectionSocket.recv(1024)的每次出现都更改为str(connectionSocket.recv(1024),‘utf-8’)。服务器现在得到了正确的字符串,但它仍然不会向我回显“hello”,也不会在我键入“bye”时停止。你调试过它吗?要么在sock.recv()后面的行上放置断点,要么打印在那里收到的内容。您将看到(如果您使用的是通过netcat手动输入!)接收的字节将是
'hello\n'
,其中仍然包括您将在netcat控制台中输入的新行。如果您使用
sock.makefile()
并像读取普通文件一样从中读取内容,可能会更容易一些?而不是处理原始的recv调用hanks!我解决了!我接受了你的回答。如果你也能投赞成票,我将不胜感激:)你使用了两个建议中的哪一个?
  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()