【问题标题】:Python 2.7: While loop, can't break outPython 2.7:while 循环,无法跳出
【发布时间】:2015-08-04 22:58:02
【问题描述】:

我是编程和这个网站的新手,所以我希望我能澄清我想要做什么。如果我发送字符串退出,我有一个试图打破的循环。它似乎只是继续前进。请帮忙!

import socket
Home = '10.0.0.5' #ipaddr
Port = 10000 #port 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((Home, Port)) 
s.send('Hey it works!') 
while True:
    data = s.recv(1024) 
    print data
    if data == 'quit': 
        break 

我可以很好地发送和接收消息,但是当我发送退出或“退出”时,它只会继续。我究竟做错了什么?

谢谢!

【问题讨论】:

  • @heinst 为什么?这没有任何意义——break 将退出 while 循环并以状态 0 退出(应该如此)
  • 我建议您使用print repr(data) 并在发送'quit' 时查看发送的内容
  • data 不是你想的那样。
  • @DavidHoelzer 绝对不是骗子。
  • @Carson 听起来您的服务器正在发回您在消息后点击Enter 的换行符。试着做data = s.recv(1024).strip()

标签: python sockets python-2.7 while-loop


【解决方案1】:

while-break- 逻辑很好。问题的一部分在于s.recv(1024) 调用,它(取决于套接字设置)可能会阻塞,直到到达那么多字节,请参阅http://linux.die.net/man/2/recv

如果套接字上没有可用的消息,则接收调用等待 消息到达,除非套接字是非阻塞的

另外,这是问题的第二部分,如果您尝试通过您的连接发送消息,您需要发明一种通信协议来分隔消息。否则data 永远不会只是'quit'

因此,要么处理字节流的所有含义并了解像recv 这样的系统调用的行为方式,要么使用对您隐藏所有这些细节的更高级别的消息传递库。

【讨论】:

  • 您好,先生,感谢您抽出宝贵时间帮助我解决我的问题。似乎我有另一个用户的临时修复。他告诉我检查 print repr(data) 的输出,它是'quit\n',我把它改成了那个,它工作正常。你能推荐一个我将来可能感兴趣的更高级别的图书馆,或者给我一个可以找到的地方吗?谢谢!
【解决方案2】:

Python recv 特别注意等待所有请求的数据可用。您可以使用os.fdopen(s.fileno()) 来获取file 对象,然后在套接字上使用普通的readwrite 函数。

【讨论】:

  • "Python recv 特别注意等待所有请求的数据可用。" ——那不是真的。 Python 的s.recv()recv() 系统调用的轻量级包装器。这完全取决于此函数返回时的套接字设置。像SO_RCVLOWAT 这样的套接字选项在这里很重要。所以,仅仅通过看到a = s.recv(N),就不能假设a 的长度是N,即使没有发生错误。该参数称为bufsize 是有原因的,不是请求的长度。
  • 收到“退出”消息后,如果没有等待 N 个字符,recv 调用将返回。等待完整缓冲区和运行旋转循环之间的中间立场是实际使用 file() 方法。
  • 我只是想知道你在说什么“额外的特殊照顾”。
  • 尽管底层的read 函数通常会做什么,但python 等待一个完整缓冲区的地方要格外小心,正如这个例子和基本上所有曾经编写的python 套接字程序所证明的那样。
  • 我们在同一页面上,总的来说,我在回答中说了同样的话,但没有让它听起来像是保证。 Python 文档也不能保证你在说什么。这仍然取决于系统。我刚刚验证了自己,在 Linux 上您可以轻松调用 conn.recv(100) 并让它只返回 4 个字节。在 Linux 上,SO_RCVLOWAT 的默认值是 1,所以这是有道理的。除非您显示一些代码,否则我不知道您在说什么“特殊护理”。
【解决方案3】:

您忘记将接收到的值解码为字符串。你可以做类似的事情

if data.decode("UTF-8") == 'quit':
   break

【讨论】:

  • 他没有使用unicode字面量(这是Python 2.7),所以这不是问题。
猜你喜欢
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 2013-05-06
  • 1970-01-01
  • 2020-04-17
  • 2018-06-13
  • 2015-12-28
相关资源
最近更新 更多