3.4 一个简单的TCPServer

以下是一个简单的TCPServer的代码(鸣谢yoki123)。

  1. class TcpServer(object):
  2. def __init__(self, address, build_class, **build_kwargs):
  3. self._address = address
  4. self._build_class = build_class
  5. self._build_kwargs = build_kwargs
  6. def _accept_handler(self, sock, fd, events):
  7. while True:
  8. try:
  9. 获得conn
  10. connection, address = sock.accept()
  11. except socket.error, e:
  12. return
  13. #通过conn解析
  14. self._handle_connect(connection)
  15. def _handle_connect(self, sock):
  16. #这里的conn主要是我们来解析数据的protocol
  17. conn = self._build_class(sock, **self._build_kwargs)
  18. self.on_connect(conn)
  19. close_callback = functools.partial(self.on_close, conn)
  20. #设置一个conn关闭时执行的回调函数
  21. conn.set_close_callback(close_callback)
  22. def startFactory(self):
  23. pass
  24. def start(self, backlog=0):
  25. #创建socket
  26. socks = build_listener(self._address, backlog=backlog)
  27. io_loop = ioloop.IOLoop.instance()
  28. for sock in socks:
  29. #接受数据的handler
  30. callback = functools.partial(self._accept_handler, sock)
  31. #为ioloop添加handler,callback
  32. io_loop.add_handler(sock.fileno(), callback, WRITE_EVENT | READ_EVENT | ERROR_EVENT)
  33. #在ioloop开启后,添加一个回调函数
  34. ioloop.IOLoop.current().add_callback(self.startFactory)
  35. #接受buff的函数,继承tcpserver的时候可以重写。
  36. def handle_stream(self, conn, buff):
  37. logger.debug('handle_stream')
  38. def stopFactory(self):
  39. pass
  40. def on_close(self, conn):
  41. logger.debug('on_close')
  42. def on_connect(self, conn):
  43. logger.debug('on_connect: %s' % repr(conn.getaddress()))
  44. handle_receive = functools.partial(self.handle_stream, conn)
  45. conn.read_util_close(handle_receive)

我们来看一下流程,

1.start().我们开启tcpserver,首先创建一个socket,, 然后我们为ioloop添加handler。
2.服务器开启后,执行_accept_handler,这个函数里是一个循环,从socket中获取conn
3.然后我们解析这个conn, build_class使我们自己实现的一个用来解析数据,拆包解包的一个protocol类,这里我们会将所有的bytes解析为我们能看懂的字符串数字等等。
4.然后我们调用on_connect函数,我们将这个conn传入handler_stream中, 前面讲过,这个函数是用来接受的stream的。然后我们从stream中读取数据,知道conn关闭。

以上就是我们服务器开启后执行的大概流程。