Can';在python上找不到停止简单telnet服务器的条件

Can';在python上找不到停止简单telnet服务器的条件,python,sockets,server,port,telnet,Python,Sockets,Server,Port,Telnet,我想创建一个简单的服务器。但服务器关闭连接的条件不满足 import socket soc = socket.socket() soc.bind(('', 33333)) soc.listen(2) (conn, address) = soc.accept() while True: data = conn.recv(1024) conn.sendall(data) if(data == 'stop'): conn.close() brea

我想创建一个简单的服务器。但服务器关闭连接的条件不满足

import socket
soc = socket.socket()
soc.bind(('', 33333))
soc.listen(2)
(conn, address) = soc.accept()
while True:
    data = conn.recv(1024)
    conn.sendall(data)
    if(data == 'stop'):
        conn.close()
        break
运行此代码后的Ubuntu bash:

~$ telnet localhost 33333
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stop
stop

变量
data
实际上等于
'stop\r\n'

用于删除线路终止符:

if data.strip() == 'stop':
< >编辑:考虑使用< < /P>获取<代码>数据< /代码>
data = ''
while not data.endswith('\n'):
    data += conn.recv(1024)

您可能还需要阅读官方文档中的。

变量
data
实际上等于
'stop\r\n'

用于删除线路终止符:

if data.strip() == 'stop':
< >编辑:考虑使用< < /P>获取<代码>数据< /代码>
data = ''
while not data.endswith('\n'):
    data += conn.recv(1024)

您可能还需要阅读官方文档中的。

这并不是那么简单,您不知道recv是否实际收到了所有数据,或者只收到了2个字节。将来遇到此问题的任何人都不要使用此功能。这只是一个看似有效的廉价黑客。TCP套接字是基于流而不是基于数据包的,因此您将发送4个字节,但接收端一次可能接收1个字节。发生这种情况时,变量数据一次只携带1个字节,并且永远不会等于“停止”。仅仅因为某些东西在测试用例中工作并不意味着它实际工作。如果我熟悉python,我会自己添加一个合适的答案。另一方面,OP说他正在使用Ubuntu,其中行终止符实际上是“\n”,在windows上是“\r\n”。我只是了解了套接字和协议。此代码不是为了实际使用,而是为了更好地理解而进行的实验。奇怪,但对我来说,这本书只适用于ubuntu 12.10的“\r\n”。这本书可能是一本很好的读物,最好是了解tcp是如何工作的,而不是听取显然不懂套接字的人的建议。就像我之前说的。Tcp是基于流的,这意味着我可以发送两次,也可以接收一次。假装我发送“hello\n”和“world\n”。在接收端,我可以在一个recv呼叫中获得“hello\nworld\n”。事实上,如果您可以访问windows计算机,请尝试在程序中使用telnet。它不起作用,因为windows telnet在您每次键入时都会发送一个数据包。@WalterM您有一点关于套接字是基于流的,但您的评论是不成比例的。这个答案直接解决了OP的问题,并不是要作为套接字编程的指南。它不是那么简单,你不知道recv是否真的收到了所有数据,或者仅仅收到了2个字节。将来遇到这个问题的任何人都不要使用它。这只是一个看似有效的廉价黑客。TCP套接字是基于流而不是基于数据包的,因此您将发送4个字节,但接收端一次可能接收1个字节。发生这种情况时,变量数据一次只携带1个字节,并且永远不会等于“停止”。仅仅因为某些东西在测试用例中工作并不意味着它实际工作。如果我熟悉python,我会自己添加一个合适的答案。另一方面,OP说他正在使用Ubuntu,其中行终止符实际上是“\n”,在windows上是“\r\n”。我只是了解了套接字和协议。此代码不是为了实际使用,而是为了更好地理解而进行的实验。奇怪,但对我来说,这本书只适用于ubuntu 12.10的“\r\n”。这本书可能是一本很好的读物,最好是了解tcp是如何工作的,而不是听取显然不懂套接字的人的建议。就像我之前说的。Tcp是基于流的,这意味着我可以发送两次,也可以接收一次。假装我发送“hello\n”和“world\n”。在接收端,我可以在一个recv呼叫中获得“hello\nworld\n”。事实上,如果您可以访问windows计算机,请尝试在程序中使用telnet。它不起作用,因为windows telnet在您每次键入时都会发送一个数据包。@WalterM您有一点关于套接字是基于流的,但您的评论是不成比例的。这个答案直接解决了OP的问题,而不是作为套接字编程的指南。Try if data.startswith('stop'):。从telnet发送“stop”时,它包含一个行终止符(例如“\r\n”)。如果data.startswith('stop'):,请尝试。从telnet发送“stop”时,它包括一个线路终止符(例如“\r\n”)。