使用套接字模块的Python简单服务器

使用套接字模块的Python简单服务器,python,sockets,networking,Python,Sockets,Networking,下面是一个使用套接字模块的简单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

下面是一个使用套接字模块的简单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)
怎么了?
请为我指出问题所在

乍一看,如果创建另一个套接字,您的程序在尝试从您打开的第一个套接字读取数据时将无休止地挂起

  • 您接受一个连接,将其保存在一个无序的集合中(使用的类型有点奇怪)
  • recv()
    在一个连接上阻塞,直到数据可用,但它在获得数据时打印出来
  • 你接受另一个连接吗
  • 第一个连接(随机)出现在
    for
    循环中,您试图从中
    recv()
    ,这将永远阻塞
  • 如果您想在多个套接字上等待,使用该模块将是谨慎的


    其他方面,
    %
    格式在Python3中很难看,不推荐使用
    .format()
    ,它从2.6开始就在Python中使用。

    第一次和第二次之间有什么变化?很抱歉,我不清楚。我指的是第二个客户端连接。