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

时间:2014-10-15 07:43:04

标签: 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[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)

出了什么问题? 请指出我的问题

1 个答案:

答案 0 :(得分:1)

乍一看,如果创建另一个套接字,您的程序将无休止地挂起,试图从您打开的第一个插槽中读取。

  1. 您接受一个连接,将其保存在无序集(有点奇怪的类型)
  2. recv()在一个连接上阻塞,直到数据可用,但在获取数据时将其打印出来。
  3. 您接受其他连接
  4. 第一个连接(随机)出现在for循环中,您尝试从recv()开始,这将永久阻止。
  5. 如果你想在多个套接字上等待,使用select模块将是谨慎的。

    其他事情,%格式化是丑陋的,并且在Python 3中不推荐使用.format(),自2.6以来一直在Python中使用。