Python游戏开发入门
在这个程序里,与前面使用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 asyncio
import logging
import sys
SERVER_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()
return
logging.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:
pass
finally:
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