Python触发1循环行为事件?

时间:2015-07-12 18:57:27

标签: python while-loop

我是python的新手,想更多地了解套接字。

我有2个测试脚本:

# server
import socket

connectionListener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connectionListener.bind(('', 8600 ))
connectionListener.listen(200)

while 1:
    #accept connections from outside
    (clientsocket, address) = connectionListener.accept()
    #now do something with the clientsocket
    #in this case, we'll pretend this is a threaded server
    print clientsocket.recv(64)
    print 'Boom!'

和:

#client
import socket

connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

connection.connect(('localhost', 8600))
connection.send('hello world!')

我以前使用的循环的行为是它会无休止地发送Boom!字符串。但事实并非如此!虽然循环似乎更像是事件触发? 仅在连接时刻打印Boom!hello world!。 它是如何工作的?

当我只离开时

while 1:
    print 'Boom!'

它表现正常"通常" (据我所知) 我可以和如何控制循环行为?

2 个答案:

答案 0 :(得分:2)

您不会被“Boom!”行发送垃圾邮件的原因是默认情况下套接字阻止。这意味着socket.recv()将暂停执行,直到收到某些内容为止。因此,当您使用while循环时,循环不会反复重复,因为recv()行会阻止它。

您可以使用socket.setblocking控制此行为,并且还可以设置套接字,因此阻塞方法将超时,因此它们不会永久阻止。如果你依赖于并行运行的其他东西,你会想要做后者,但是如果你的程序仅用于使用套接字,那么永远阻塞它就好了,实际上是保持处理器空闲的好方法。 / p>

答案 1 :(得分:2)

socket.accept阻止,直到建立新连接。如果您希望反复打印“Boom”,则需要重复更新客户端代码connectsendclose。否则,您的服务器将在等待新连接时阻止第二次迭代。

做这样的事情:

#client
import socket

connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

while True:
    connection.connect(('localhost', 8600))
    connection.send('hello world!')
    connection.close()