下面是一个使用套接字模块的简单python服务器:
import socket
import sys
HOST = ''
PORT = 8008
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
s.bind((HOST,PORT))
except socket.error as msg:
print 'Bind failed. Error code : %s , Message : %s'%(msg[0],msg[1])
sys.exit()
print 'Socket bind complete!'
s.listen(10)
socket.setdefaulttimeout(3)
l = set()
while True:
try:
a = s.accept()
print 'Connected with %s:%d'%a[1]
l.add(a)
except:
print 'Accept error!'
for a in l:
b = a[0].recv(4096)
if b:
print 'From %s:%d'%a[1]+' recv: %s'%b
第一次是正确的(客户连接),但程序第二次停留。
Socket bind complete!
Connected with 127.0.0.1:52093
From 127.0.0.1:52093 recv: aasdf
_
(STUCK)
出了什么问题? 请指出我的问题
答案 0 :(得分:1)
乍一看,如果创建另一个套接字,您的程序将无休止地挂起,试图从您打开的第一个插槽中读取。
recv()
在一个连接上阻塞,直到数据可用,但在获取数据时将其打印出来。for
循环中,您尝试从recv()
开始,这将永久阻止。如果你想在多个套接字上等待,使用select
模块将是谨慎的。
其他事情,%
格式化是丑陋的,并且在Python 3中不推荐使用.format()
,自2.6以来一直在Python中使用。