Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167506
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-13 17:05
文章分类

全部博文(31)

文章存档

2016年(11)

2015年(20)

我的朋友

分类: Python/Ruby

2016-01-28 13:06:03

    当一个程序在等待数据,另一个并行的程序可以继续处理它们自己的客户端,另外的处理方法是只处理在给定时间内正真要进行通信的客户端,不需要一直监听。这就是异步。
测试代码如下:

  1. #!/bin/env python
  2. import socket
  3. import select
  4. s = socket.socket()
  5.  
  6. HOST,PORT = '',1234
  7.  
  8. s.bind((HOST,PORT))
  9. s.listen(5)
  10. inputs = [s]
  11. print inputs
  12. while True:
  13.     rs,ws,es = select.select(inputs,[],[])
  14.     print rs
  15.     for r in rs:
  16.         print r
  17.         print s
  18.         if r is s:
  19.             c,addr = s.accept()
  20.             print 'Got connection from ',addr
  21.             inputs.append(c)
  22.             print inputs
  23.         else:
  24.             try:
  25.                 data = r.recv(1024)
  26.                 disconnected = not data
  27.             except socket.error:
  28.                 disconnected = True
  29.             if disconnected:
  30.                 print r.getpeername(),'disconnected'
  31.                 inputs.remove(r)
  32.             else:
  33.                 print data,
通过调试得出如下结论:

    1、当有客户端第一次连接服务器端的时候,inputs序列的值就是服务器端的socket,然后在while循环的开始,将inputs序列了存储的服务器socket赋值给变量rs
    2、for循环r取得服务器的socket,当前rs里面只有服务器socket,然后通过if条件判断,当for遍历的r 是 服务器socket,取得客户端socket和地址信息,然后在将客户端的地址信息append到inputs序列,if执行完毕。
    3、按照通常情况下,此时程序应该是在accept()阻塞着并等待客户端再次连接。如果是这样,程序就会一直不停的append。
    4、程序在accept()之前调用了select()函数,调用的意义就是:首先select()函数在这里起到了独立阻塞的作用,直到该客户端再次连接。
    5、当另一个客户端再次连接服务器socket时,第一次连接和第2、3点解释的一样。这样通过select()函数就实现了异步连接。
    6、其实select()异步连接就有点像Linux的虚拟终端,最高进程init 然后可以通过ssh工具连接很多shell,但是每个shell又是相互独立的。

异步是非阻塞的,调用后即返回,不等待;同步是阻塞的,等待,直到成功为止

不知道以上对于python select模块网络异步连接理解的有没有问题,请指教。

阅读(2817) | 评论(0) | 转发(0) |
0

上一篇:[ Python ] socket模块及实例

下一篇:没有了

给主人留下些什么吧!~~