【问题标题】:Can' t find condition to stop simple telnet server on python找不到在 python 上停止简单 telnet 服务器的条件
【发布时间】:2015-11-04 16:21:53
【问题描述】:

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

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.startswith('stop'):。当您从 telnet 发送 'stop' 时,它包含一个行终止符(例如 '\r\n')。

标签: python sockets server port telnet


【解决方案1】:

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

使用str.strip 删除行终止符:

if data.strip() == 'stop':

编辑:考虑使用以下方式获取data

data = ''
while not data.endswith('\n'):
    data += conn.recv(1024)

您可能还想阅读官方文档中的Socket Programming HOWTO

【讨论】:

  • 没那么简单,你不知道recv是真的收到了所有的数据,还是只有2个字节。
  • 以后遇到这个的人,不要用这个。这只是一个似乎有效的廉价黑客。 TCP 套接字是基于流而不是基于数据包的,因此您将发送 4 个字节,但接收端可能一次接收 1 个字节。发生这种情况时,变量数据一次只能携带 1 个字节,并且永远不会等于“停止”。仅仅因为某些东西在测试用例中有效并不意味着它确实有效。如果我对 python 感到满意,我会自己添加一个正确的答案。在旁注中,OP 说他正在使用 Ubuntu,其中行终止符实际上是 '\n',它在 Windows 上是 '\r\n'。
  • 我刚刚学习了套接字和协议。此代码不是为了实际使用,而是为了更好地理解而进行实验。奇怪,但对我来说,只适用于 '\r\n' 和 ubuntu 12.10
  • 这可能是一个很好的阅读stupidpythonideas.blogspot.ca/2013/05/… 最好了解 tcp 的工作原理,而不是听从明显不了解套接字的人的建议。就像我之前说的。 Tcp 是基于流的,这意味着我可以发送 2 次,也可以接收一次。假装我发送 'hello\n' 和 'world\n'。在接收端,我可以在一个 recv 呼叫中得到 'hello\nworld\n'。事实上,如果您可以访问 Windows 计算机,请尝试在您的程序中使用 telnet。它不起作用,因为 Windows telnet 每次键入时都会发送一个数据包。
  • @WalterM 您对基于流的套接字有意见,但您的评论不成比例。这个答案直接解决了 OP 的问题,并不意味着作为套接字编程的指南。
猜你喜欢
  • 2011-09-23
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 2016-05-18
  • 1970-01-01
  • 2016-01-28
相关资源
最近更新 更多