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