我在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"。
时,它也不会关闭套接字答案 0 :(得分:1)
使用netcat而不是telnet来避免telnet协议字节。
像这样:newValue
然后键入你的输入。
此外,套接字I / O在Python 3中始终是字节,例如,请参阅https://docs.python.org/3/library/socket.html#socket.socket.recv所以你必须与nc localhost 20000
进行比较(或首先将字节解码为字符串)