当前位置:   article > 正文

asyncio Protocol

asyncio protocol

asyncio 模块的Protocol使用

myblog

source code
[source code]

Protocol

  1. 提供了几个'BaseProtocol', 'Protocol', 'DatagramProtocol''SubprocessProtocol' 实例

  2. 基本的方法:

    1. connection_made()
    2. data_received() # 这个是类似于一个循环,循环调用者个方法来读取内容
    3. eof_received()
    4. connection_lost()
  3. 启动顺序依次是

    1. State machine of calls:
    2. start -> CM [-> DR*] [-> ER?] -> CL -> end
    3. * CM: connection_made()
    4. * DR: data_received()
    5. * ER: eof_received()
    6. * CL: connection_lost()

create_server

  1. create_server

    1. def create_server(self, protocol_factory, host=None, port=None, *,
    2. family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE,
    3. sock=None, backlog=100, ssl=None, reuse_address=None,
    4. reuse_port=None):
    5. # 用来建立一个TCP 类型的Server,提供了默认的一些参数
    6. 关于详细的内容可以查看asyncio.events 模块
    7. protocol_factory 我们使用asyncio.Protocol 来做工厂函数

connect_server/client

  1. create_connection()

    1. def create_connection(self, protocol_factory, host=None, port=None, *,
    2. ssl=None, family=0, proto=0, flags=0, sock=None,
    3. local_addr=None, server_hostname=None):
    4. raise NotImplementedError

loop

  1. asyncio事件循环

    loop = asyncio.get_event_loop()
    

Server.py

  1. class EchoServerClientProtocol(asyncio.Protocol):
  2. def connection_made(self, transport):
  3. peername = transport.get_extra_info('peername')
  4. print('Connection from {}'.format(peername))
  5. self.transport = transport
  6. self.word_title = '我们一起来背诵 <<荷叶杯·记得那年花下>>'
  7. self.word_list = ['记得那年花下', '深夜', '初识谢娘时', '水堂西面画帘垂', '携手暗相期',
  8. '惆怅晓莺残月', '相别', '从此隔音尘', '如今俱是异乡人', '相见更无因']
  9. self.index = 0
  10. def data_received(self, data):
  11. message = data.decode()
  12. print('Data received: {!r}'.format(message))
  13. try:
  14. message = self.find_next(data=data.decode())
  15. print('Send: {!r}'.format(message))
  16. self.transport.write(message.encode())
  17. except (IndexError,ValueError):
  18. message = input('input the message:')
  19. print('Send: {!r}'.format(message))
  20. self.transport.write(message.encode())
  21. def find_next(self, data):
  22. index = self.word_list.index(data)
  23. return self.word_list[index + 1]
  24. loop = asyncio.get_event_loop()
  25. # Each client connection will create a new protocol instance
  26. coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
  27. server = loop.run_until_complete(coro)
  28. # Serve requests until Ctrl+C is pressed
  29. print('Serving on {}'.format(server.sockets[0].getsockname()))
  30. try:
  31. loop.run_forever()
  32. except KeyboardInterrupt:
  33. pass
  34. # Close the server
  35. server.close()
  36. loop.run_until_complete(server.wait_closed())
  37. loop.close()

client.py

  1. class EchoClientProtocol(asyncio.Protocol):
  2. def __init__(self, loop):
  3. self.loop = loop
  4. self.transport = None
  5. self.word_title = '我们一起来背诵 <<荷叶杯·记得那年花下>>'
  6. self.word_list = ['记得那年花下', '深夜', '初识谢娘时', '水堂西面画帘垂', '携手暗相期',
  7. '惆怅晓莺残月', '相别', '从此隔音尘', '如今俱是异乡人', '相见更无因']
  8. self.index = 0
  9. print(self.word_title)
  10. def connection_made(self, transport):
  11. self.transport = transport
  12. message = self.word_list[self.index]
  13. print('message: ',message)
  14. self.transport.write(message.encode())
  15. def data_received(self, data):
  16. print('Data received: {!r}'.format(data.decode()))
  17. try:
  18. message = self.find_next(data=data.decode())
  19. self.transport.write(message.encode())
  20. print('Data sent: {!r}'.format(message))
  21. except (IndexError,ValueError):
  22. message = input('input message:')
  23. self.transport.write(message.encode())
  24. print('Data sent: {!r}'.format(message))
  25. def connection_lost(self, exc):
  26. print('The server closed the connection')
  27. print('Stop the event loop')
  28. self.loop.stop()
  29. def find_next(self, data):
  30. index = self.word_list.index(data)
  31. return self.word_list[index + 1]
  32. loop = asyncio.get_event_loop()
  33. coro = loop.create_connection(lambda: EchoClientProtocol(loop),
  34. '127.0.0.1', 8888)
  35. loop.run_until_complete(coro)
  36. loop.run_forever()
  37. loop.close()

代码运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/91421
推荐阅读
相关标签
  

闽ICP备14008679号