python中的select.select需要1到3个参数序列

时间:2013-10-13 16:03:47

标签: python sockets

我继续收到这个需要为序列的1-3个参数的错误

import socket               # Import socket module
import sys 
import select

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        # Create a socket object
host = "127.0.0.1" # Get local machine name
port = 50001               # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

a = []
b = []

s.listen(1)                 # Now wait for client connection.
c, addr = s.accept()     # Establish connection with client.

s.setblocking(0)

ready = select.select(s, s, s, 1)  # i believe the error lies in here 
while True:
   print "reached"
   if ready[0]:
      print "reached1"
      data = mysocket.recv(4096)
   print 'Got connection from', addr
   c.send('Thank you for connecting \r\n') #all strings have to end with /r/n!!!
   print "sent"
c.close()                # Close the connection

错误

Select.select参数1 - 3必须是序列。

我是python的新手,因此我不确定错误是什么。我用另一篇帖子搜索了选择代码,因为我希望我的recv套接字是非阻塞的

1 个答案:

答案 0 :(得分:4)

select.select将三个列表作为参数rlistwlistxlist

  
      
  • rlist:等到准备好阅读
  •   
  • wlist:等到准备好写作
  •   
  • xlist:等待“异常情况”(请参阅​​手册页,了解系统认为的这种情况)
  •   

你没有传递列表而是单个套接字。

试试这个:

ready = select.select([s], [s], [s], 1)

返回值将再次是三个列表的元组,第一个包含准备好读取的包含套接字,第二个套接字准备好写入,第三个套接字处于“异常条件”。

另请注意,在while循环中,您永远不会更新ready,因此您将始终使用相同的套接字列表。此外,你应该在某处break,否则你最终会在无限循环中调用c.send