- 论坛徽章:
- 0
|
最近小弟在学习python socket,看到asyncore的时候,自己试着去理解了一个例子, 有些不懂的地方, 还请有大牛哥能给解释一下, 感谢!- import argparse
- 解析命令参数的
- import asyncore
- 异步核心,封装socket用的
- import socket
- socket基础支持模块
- LOCAL_SERVER_HOST = 'localhost'
- 定义一个本地LOCAL变量
- REMOTE_SERVER_HOST = 'www-test-com'
- 定义一个远程SERVR变量
- BUFSIZE = 4096
- 定义一个允许最大字节大小
- class PortForwarder(asyncore.dispatcher):
- 定义一个继承asyncore.dispatcher的端口转发类,dispatcher是基础类,目的是方便任意组合通道
- def __init__(self,ip,port,remoteip,remoteport,backlog=5):
- 在端口转发类中定义一个构造函数,该构造函数给了五个参数,依次为ip(本地客户端ip),port(本地客户端port),remoteip(远程服务端ip),remoteport(服务端端口)
- asyncore.dispatcher.__init__(self):
- 使用asyncore.dispatcher重写该构造函数
- self.remoteip = remoteip
- 把对象方法remoteip重定义为remoteip
- self.remoteport = remoteport
- 把对象方法remoteport重定义为remoteport
- self.create_socket(socket.INET,socket.SOCK_STREAM)
- 创建一个IPV4,TCP的套接字对象
- self.set_reuse_addr()
- 定义一个set_reuse_addr方法,这么做的目的是为了保留当前port number一段时间, 除非使用该方法才能重新使用一个端口
- self.bind((ip,port))
- 使用bind方法,绑定local ip, port, 因为它是一个元组,所以使用()括起来
- self.listen(backlog)
- 使用listen方法监听传入的new socket
- def handle_accept(asyncore.dispatcher):
- 如果监听到了传入连接,就会触发accpet,这个时候得到的是一个handle_accept,到这里,依然是继承asyncore.dispatcher
- conn,addr = self.accept()
- conn是得到的一个新的套接字对象,addr是新套接字对象的ip,port, 然后使用对象.accpet()进行队列处理
- print('Connect',addr)
- 打印出一条欢迎信息
- Sender(Receiver(conn),remoteip,remoteport)
- 使用sender类发送receiver处理后的新套接字对象,就是把客户端ip,port 转发到远程。
-
- class Receiver(asyncore.dispatcher):
- 这个是处理接收新套接字的类
- def __init__(self,conn):
- 依然是一个构造函数,因为这个只是处理新套接字的,所以就一个conn
-
- asyncore.dispatcher.__init__(self,conn)
- 使用asyncore.dispatcher重写构造函数
- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- self.from_remote_buffer = ''
- 预定义一个发送时的buffer大小?其实这里我不确定
- self.to_remote_buffer = ''
- 预定义一个接收到的buffer大小,这里也不确定。。
- from和to这里,from应该是local ip port的buffer吧,to是remote接收到的?
- 希望有大牛能给解释一下,感谢。。。有点晕。
- self.sender = None
- 这里为什么写一个这个,还留了一个空?
- def handle_connect(self):
- pass
- 这里我知道,如果开始建立连接了,得到的是一个connect句柄,因为这个时候是不会有传递的,所以pass掉
- def handle_read(self):
- 真正建立链接后开始读取
- read = self.read(BUFSIZE)
- self.from_remote_buffer += read
- def writeable(self):
- return (len(self.to_remote_buffer)>0)
- def handle_write(self):
- sent = self.send(self.to_remote_buffer)
- self.to_remote_buffer = self.to_remote_buffer[sent:]
- def handle_close(self):
- self.close()
- if self.sender:
- self.sender.close()
- class Sender(asyncore.dispatcher):
- def __init__(self,receiver,remoteaddr,remoteport):
- asyncore.dispatcher.__init__(self)
- self.receiver = receiver
- self.sender = slef
- self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
- self.connect((remoteaddr,remoteport))
- def handle_connect(self):
- pass
- def handle_read(self):
- read = self.recv(BUFSIZE)
- self.receiver.to_remote_buffer + = read
- def writable(self):
- return (len(self.receiver.from_remote_buffer)>0)
- def handle_write(self):
- sent = self.send(self.receiver.from_remote_buffer)
- self.receiver.from_remote_buffer = self.receiver.from_remote_buffer[sent:]
- def handle_close(self):
- self.close()
- self.receiver.close()
-
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
复制代码 /////中的信息, 再次感谢!
|
|