python里使用协程和StreamReader、StreamWriter来创建echo服务端

来源:互联网 发布:外国人眼中的中国 知乎 编辑:程序博客网 时间:2024/06/08 06:48

Python游戏开发入门

http://edu.csdn.net/course/detail/5690

在这个程序里,与前面使用asyncio.Protocol协议不一样,使用底层的StreamReader、StreamWriter来创建。

首先导入asyncio和logging库,接着导入sys库。
定义服务器的IP地址和端口,以便服务器创建监听的端口。
开始定义echo(reader, writer)协程函数,这个函数是当客户端有socket连接过来就会调用这个函数响应,每一个连接过来,就创建一个协程对应工作,所以每个连接是隔离的。
接着配置logging.basicConfig的日志输出。
使用asyncio.get_event_loop()来创建协程的事件循环,使用event_loop.run_forever()进入服务器无限循环。
start_server()创建了一个任务factory返回,接着使用run_until_complete函数运行任务。

这里run_until_complete(server.wait_closed())等所有任务关闭。

源码如下:

import asyncioimport loggingimport sysSERVER_ADDRESS = ('localhost', 10000)async def echo(reader, writer):    address = writer.get_extra_info('peername')    log = logging.getLogger('echo_{}_{}'.format(*address))    log.debug('connection accepted')    while True:        data = await reader.read(128)        if data:            log.debug('received {!r}'.format(data))            writer.write(data)            await writer.drain()            log.debug('sent {!r}'.format(data))        else:            log.debug('closing')            writer.close()            returnlogging.basicConfig(    level=logging.DEBUG,    format='%(name)s: %(message)s',    stream=sys.stderr,)log = logging.getLogger('main')event_loop = asyncio.get_event_loop()# event_loop.set_debug(True)# Create the server and let the loop finish the coroutine before# starting the real event loop.factory = asyncio.start_server(echo, *SERVER_ADDRESS)server = event_loop.run_until_complete(factory)log.debug('starting up on {} port {}'.format(*SERVER_ADDRESS))# Enter the event loop permanently to handle all connections.try:    event_loop.run_forever()except KeyboardInterrupt:    passfinally:    log.debug('closing server')    server.close()    event_loop.run_until_complete(server.wait_closed())    log.debug('closing event loop')    event_loop.close()

输出如下:

asyncio: Using selector: SelectSelector
main: starting up on localhost port 10000
echo_::1_51532: connection accepted
echo_::1_51532: received b'This is the message. It will be sent in parts.'
echo_::1_51532: sent b'This is the message. It will be sent in parts.'
echo_::1_51532: closing

Python游戏开发入门

http://edu.csdn.net/course/detail/5690

你也能动手修改C编译器

http://edu.csdn.net/course/detail/5582

纸牌游戏开发

http://edu.csdn.net/course/detail/5538 

五子棋游戏开发

http://edu.csdn.net/course/detail/5487
RPG游戏从入门到精通
http://edu.csdn.net/course/detail/5246
WiX安装工具的使用
http://edu.csdn.net/course/detail/5207
俄罗斯方块游戏开发
http://edu.csdn.net/course/detail/5110
boost库入门基础
http://edu.csdn.net/course/detail/5029
Arduino入门基础
http://edu.csdn.net/course/detail/4931
Unity5.x游戏基础入门
http://edu.csdn.net/course/detail/4810
TensorFlow API攻略
http://edu.csdn.net/course/detail/4495
TensorFlow入门基本教程
http://edu.csdn.net/course/detail/4369
C++标准模板库从入门到精通 
http://edu.csdn.net/course/detail/3324
跟老菜鸟学C++
http://edu.csdn.net/course/detail/2901
跟老菜鸟学python
http://edu.csdn.net/course/detail/2592
在VC2015里学会使用tinyxml库
http://edu.csdn.net/course/detail/2590
在Windows下SVN的版本管理与实战 
http://edu.csdn.net/course/detail/2579
Visual Studio 2015开发C++程序的基本使用 
http://edu.csdn.net/course/detail/2570
在VC2015里使用protobuf协议
http://edu.csdn.net/course/detail/2582
在VC2015里学会使用MySQL数据库
http://edu.csdn.net/course/detail/2672