select

服务器端:
1
#!/usr/bin/env python 2 #coding:utf-8 3 4 5 import select 6 import socket 7 import sys 8 import Queue 9 10 11 # Create a TCP/IP socket 12 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13 server.setblocking(0)#设置0就是非阻塞模式,1就是阻塞模式 14 15 # Bind the socket to the port 16 server_address = ('localhost', 10000) 17 print >> sys.stderr, 'starting up on %s port %s' % server_address 18 server.bind(server_address) 19 20 # Listen for incoming connections 21 server.listen(5)#最大允许的连接数是5 22 23 24 # Sockets from which we expect to read 25 inputs = [server] 26 27 # Sockets to which we expect to write 28 outputs = [] 29 30 31 # Outgoing message queues (socket:Queue) 32 message_queues = {} 33 34 while inputs:#死循环 35 36 # Wait for at least one of the sockets to be ready for processing 37 print >>sys.stderr, '\nwaiting for the next event' 38 readable, writable, exceptional = select.select(inputs, outputs, inputs)#第三个是错误信息,这个select就是要检测是否有就绪的文件描述符 39 40 41 # Handle inputs 42 for s in readable:#找出已经就绪的连接 43 44 if s is server:#如果此时是一个新链接 45 # A "readable" server socket is ready to accept a connection 46 connection, client_address = s.accept() 47 print >> sys.stderr, 'new connection from', client_address 48 connection.setblocking(0) 49 inputs.append(connection) 50 51 # Give the connection a queue for data we want to send 52 message_queues[connection] = Queue.Queue()#每个连接一个q,保证独立不乱 53 54 else:#此时是老连接,开始接收数据 55 data = s.recv(1024) 56 if data: 57 # A readable client socket has data 58 print >> sys.stderr, 'received "%s" from %s' % (data, s.getpeername()) 59 message_queues[s].put(data) 60 # Add output channel for response 61 if s not in outputs: 62 outputs.append(s) 63 else: 64 # Interpret empty result as closed connection 65 print >> sys.stderr, 'closing', client_address, 'after reading no data' 66 # Stop listening for input on the connection 67 if s in outputs: 68 outputs.remove(s) # 既然客户端都断开了,我就不用再给它返回数据了,所以这时候如果这个客户端的连接对象还在outputs列表中,就把它删掉 69 inputs.remove(s) # inputs中也删除掉 70 s.close() # 把这个连接关闭掉 71 72 # Remove message queue 73 del message_queues[s] 74 75 # Handle outputs 76 for s in writable: 77 try: 78 next_msg = message_queues[s].get_nowait() 79 except Queue.Empty: 80 # No messages waiting so stop checking for writability. 81 print >>sys.stderr, 'output queue for', s.getpeername(), 'is empty' 82 outputs.remove(s) 83 else: 84 print >>sys.stderr, 'sending "%s" to %s' % (next_msg, s.getpeername()) 85 s.send(next_msg) 86 87 # Handle "exceptional conditions" 88 for s in exceptional: 89 print >> sys.stderr, 'handling exceptional condition for', s.getpeername() 90 # Stop listening for input on the connection 91 inputs.remove(s) 92 if s in outputs: 93 outputs.remove(s) 94 s.close() 95 96 # Remove message queue 97 del message_queues[s]
 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 import socket
 5 import sys
 6 
 7 messages = ['This is the message. ',
 8             'It will be sent ',
 9             'in parts.',
10             ]
11 server_address = ('localhost', 10000)
12 
13 # Create a TCP/IP socket
14 socks = [socket.socket(socket.AF_INET, socket.SOCK_STREAM),
15          socket.socket(socket.AF_INET, socket.SOCK_STREAM),
16          ]
17 
18 # Connect the socket to the port where the server is listening
19 print >> sys.stderr, 'connecting to %s port %s' % server_address
20 for s in socks:
21     s.connect(server_address)
22 
23 for message in messages:
24 
25     # Send messages on both sockets
26     for s in socks:
27         print >> sys.stderr, '%s: sending "%s"' % (s.getsockname(), message)
28         s.send(message)
29 
30     # Read responses on both sockets
31     for s in socks:
32         data = s.recv(1024)
33         print >> sys.stderr, '%s: received "%s"' % (s.getsockname(), data)
34         if not data:
35             print >> sys.stderr, 'closing socket', s.getsockname()
View Code

 

posted @ 2017-05-29 09:08  腐汝  阅读(245)  评论(0编辑  收藏  举报