免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2618 | 回复: 2
打印 上一主题 下一主题

python asyncore一个例子遇到的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-29 04:32 |只看该作者 |倒序浏览
最近小弟在学习python socket,看到asyncore的时候,自己试着去理解了一个例子, 有些不懂的地方, 还请有大牛哥能给解释一下, 感谢!
  1. import argparse

  2. 解析命令参数的


  3. import asyncore

  4. 异步核心,封装socket用的

  5. import socket

  6. socket基础支持模块


  7. LOCAL_SERVER_HOST = 'localhost'

  8. 定义一个本地LOCAL变量

  9. REMOTE_SERVER_HOST = 'www-test-com'

  10. 定义一个远程SERVR变量

  11. BUFSIZE = 4096

  12. 定义一个允许最大字节大小

  13. class PortForwarder(asyncore.dispatcher):

  14. 定义一个继承asyncore.dispatcher的端口转发类,dispatcher是基础类,目的是方便任意组合通道

  15.     def __init__(self,ip,port,remoteip,remoteport,backlog=5):


  16. 在端口转发类中定义一个构造函数,该构造函数给了五个参数,依次为ip(本地客户端ip),port(本地客户端port),remoteip(远程服务端ip),remoteport(服务端端口)

  17.         asyncore.dispatcher.__init__(self):

  18. 使用asyncore.dispatcher重写该构造函数

  19.             self.remoteip = remoteip

  20. 把对象方法remoteip重定义为remoteip

  21.             self.remoteport = remoteport

  22. 把对象方法remoteport重定义为remoteport

  23.             self.create_socket(socket.INET,socket.SOCK_STREAM)

  24. 创建一个IPV4,TCP的套接字对象

  25.             self.set_reuse_addr()

  26. 定义一个set_reuse_addr方法,这么做的目的是为了保留当前port number一段时间, 除非使用该方法才能重新使用一个端口

  27.             self.bind((ip,port))

  28. 使用bind方法,绑定local ip, port, 因为它是一个元组,所以使用()括起来

  29.             self.listen(backlog)

  30. 使用listen方法监听传入的new socket

  31.     def handle_accept(asyncore.dispatcher):

  32. 如果监听到了传入连接,就会触发accpet,这个时候得到的是一个handle_accept,到这里,依然是继承asyncore.dispatcher

  33.         conn,addr = self.accept()

  34. conn是得到的一个新的套接字对象,addr是新套接字对象的ip,port, 然后使用对象.accpet()进行队列处理

  35.         print('Connect',addr)

  36. 打印出一条欢迎信息

  37.         Sender(Receiver(conn),remoteip,remoteport)


  38. 使用sender类发送receiver处理后的新套接字对象,就是把客户端ip,port 转发到远程。
  39.         
  40. class Receiver(asyncore.dispatcher):

  41. 这个是处理接收新套接字的类

  42.     def __init__(self,conn):

  43. 依然是一个构造函数,因为这个只是处理新套接字的,所以就一个conn

  44.         asyncore.dispatcher.__init__(self,conn)

  45. 使用asyncore.dispatcher重写构造函数


  46. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  47.         self.from_remote_buffer = ''

  48. 预定义一个发送时的buffer大小?其实这里我不确定

  49.         self.to_remote_buffer = ''

  50. 预定义一个接收到的buffer大小,这里也不确定。。


  51. from和to这里,from应该是local ip port的buffer吧,to是remote接收到的?
  52. 希望有大牛能给解释一下,感谢。。。有点晕。




  53.         self.sender = None

  54. 这里为什么写一个这个,还留了一个空?

  55.     def handle_connect(self):
  56.         pass

  57. 这里我知道,如果开始建立连接了,得到的是一个connect句柄,因为这个时候是不会有传递的,所以pass掉

  58.     def handle_read(self):

  59. 真正建立链接后开始读取

  60.         read = self.read(BUFSIZE)
  61.         self.from_remote_buffer += read
  62.     def writeable(self):
  63.         return (len(self.to_remote_buffer)>0)
  64.     def handle_write(self):
  65.         sent = self.send(self.to_remote_buffer)
  66.         self.to_remote_buffer = self.to_remote_buffer[sent:]
  67.         def handle_close(self):
  68.             self.close()
  69.             if self.sender:
  70.                 self.sender.close()


  71. class Sender(asyncore.dispatcher):
  72.     def __init__(self,receiver,remoteaddr,remoteport):
  73.         asyncore.dispatcher.__init__(self)
  74.         self.receiver = receiver
  75.         self.sender = slef
  76.         self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
  77.         self.connect((remoteaddr,remoteport))
  78.     def handle_connect(self):
  79.         pass
  80.     def handle_read(self):
  81.         read = self.recv(BUFSIZE)
  82.         self.receiver.to_remote_buffer + = read
  83.     def writable(self):
  84.         return (len(self.receiver.from_remote_buffer)>0)
  85.     def handle_write(self):
  86.         sent = self.send(self.receiver.from_remote_buffer)
  87.         self.receiver.from_remote_buffer = self.receiver.from_remote_buffer[sent:]
  88.     def handle_close(self):
  89.         self.close()
  90.         self.receiver.close()
  91.   

  92.   //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
复制代码
/////中的信息, 再次感谢!

论坛徽章:
0
2 [报告]
发表于 2015-05-29 12:03 |只看该作者
自顶~。。。

论坛徽章:
10
数据库技术版块每日发帖之星
日期:2015-06-14 22:20:00数据库技术版块每日发帖之星
日期:2016-03-10 06:20:00数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00IT运维版块每日发帖之星
日期:2015-11-09 06:20:00IT运维版块每日发帖之星
日期:2015-11-02 06:20:00IT运维版块每日发帖之星
日期:2015-07-13 22:59:28IT运维版块每日发帖之星
日期:2015-06-23 22:20:00程序设计版块每日发帖之星
日期:2015-06-21 22:20:00每日论坛发贴之星
日期:2015-06-14 22:20:00IT运维版块每日发帖之星
日期:2016-08-02 06:20:00
3 [报告]
发表于 2015-06-13 23:56 |只看该作者
哪里不明白呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP