我是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!'
它表现正常"通常" (据我所知) 我可以和如何控制循环行为?
答案 0 :(得分:2)
您不会被“Boom!”行发送垃圾邮件的原因是默认情况下套接字阻止。这意味着socket.recv()
将暂停执行,直到收到某些内容为止。因此,当您使用while循环时,循环不会反复重复,因为recv()
行会阻止它。
您可以使用socket.setblocking
控制此行为,并且还可以设置套接字,因此阻塞方法将超时,因此它们不会永久阻止。如果你依赖于并行运行的其他东西,你会想要做后者,但是如果你的程序仅用于使用套接字,那么永远阻塞它就好了,实际上是保持处理器空闲的好方法。 / p>
答案 1 :(得分:2)
socket.accept
阻止,直到建立新连接。如果您希望反复打印“Boom”,则需要重复更新客户端代码connect
,send
和close
。否则,您的服务器将在等待新连接时阻止第二次迭代。
做这样的事情:
#client
import socket
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
connection.connect(('localhost', 8600))
connection.send('hello world!')
connection.close()