Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python2.7:While循环,can';不能爆发_Python_Sockets_Python 2.7_While Loop - Fatal编程技术网

Python2.7:While循环,can';不能爆发

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

我对编程和这个网站都是新手,所以我希望我能澄清我想做什么。如果我发送字符串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:
    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,它工作正常。你能推荐一个我将来可能感兴趣的更高层次的图书馆吗?或者给我指一个我能找到的地方?非常感谢。