Python2.7:While循环,can';不能爆发
我对编程和这个网站都是新手,所以我希望我能澄清我想做什么。如果我发送字符串quit,我将尝试打破一个循环。它似乎一直在继续。请帮忙Python2.7:While循环,can';不能爆发,python,sockets,python-2.7,while-loop,Python,Sockets,Python 2.7,While Loop,我对编程和这个网站都是新手,所以我希望我能澄清我想做什么。如果我发送字符串quit,我将尝试打破一个循环。它似乎一直在继续。请帮忙 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: dat
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
我可以很好地发送和接收消息,但当我发送“退出”或“退出”消息时,它会继续运行。我做错了什么
谢谢大家! while-
break
-逻辑正常。问题的第一部分出现在s.recv(1024)
调用中,该调用(取决于套接字设置)可能会阻塞,直到到达这么多字节,请参阅:
如果套接字上没有可用的消息,则接收呼叫将等待
要到达的消息,除非套接字是非阻塞的
此外,这也是问题的第二部分,如果您试图通过连接发送消息,您需要发明一种通信协议来限定消息。否则,数据
将永远不会只是“退出”
因此,要么处理字节流的所有含义并了解系统调用(如
recv
)的行为,要么使用更高级的消息传递库对您隐藏所有这些细节。您忘记将接收到的值解码为字符串。你可以这样做
if data.decode("UTF-8") == 'quit':
break
Python
recv
特别注意等待,直到请求的所有数据都可用。您可以使用os.fdopen(s.fileno())
获取文件
对象,然后在套接字上使用正常的读取
和写入
函数。@heinst为什么?这没有任何意义--中断
将退出,同时
循环并以状态0退出(就像应该的那样)。我建议执行打印报告(数据)
“退出”数据发送时,查看发送的内容并不是你想象的那样。@DavidHoelzer绝对不是一个复制品。@Carson听起来你的服务器好像在消息后按Enter键发回新行。试着只做data=s.recv(1024).strip()
他没有使用unicode文本(这是Python 2.7),所以这不是一个问题。“Python recv特别注意等待,直到所有请求的数据都可用。”--这不是真的。Python的s.recv()
是围绕recv()
系统调用的轻量级包装。它完全取决于此函数返回时的套接字设置。像这样的套接字选项在这里很重要。因此,只要看到a=s.recv(N)
,就不能假设a
的长度N
,即使没有发生错误。该参数之所以被称为bufsize
,是因为它不是请求的长度。在收到“quit”消息后,如果recv调用不等待N个字符,它将返回。等待完全缓冲区和运行旋转循环之间的中间点是实际使用file()
方法。我只是想知道您所说的“额外特别注意”是什么。在python等待完全缓冲区时,不管底层的read
函数通常会做什么,正如这个例子和基本上所有编写过的python套接字程序所证明的那样,我们在这里处于同一页上,一般来说,我在我的回答中也说过同样的话,但听起来并不是保证。Python文档也不能保证您所说的内容。这仍然取决于系统。我刚刚验证了自己,在Linux上,您可以轻松地调用conn.recv(100)
,让它只返回4个字节。在Linux上,SO_RCVLOWAT
的默认值为1,因此这是有意义的。除非您出示一些代码,否则我不知道您在说什么“特别护理”。您好,先生,感谢您抽出时间帮助我解决我的问题。似乎我有一个来自另一个用户的临时修复程序。他让我检查打印报告(数据)的输出,它是“退出”\n,我将它改为“退出”\n,它工作正常。你能推荐一个我将来可能感兴趣的更高层次的图书馆吗?或者给我指一个我能找到的地方?非常感谢。