Python asyncio-heartbeat()方法未写入流
我试图用Python3Asyncio创建一个概念证明,实现一个定期向服务器发送心跳的客户端,以保持连接的活动性 请注意,服务器只是一个echo服务器,不会关闭连接。但重要的是,客户端能够定期发送心跳信号 以下是当前的实施情况: stream_client.py stream_server.py 问题: 在Python asyncio-heartbeat()方法未写入流,python,python-3.x,concurrency,python-asyncio,Python,Python 3.x,Concurrency,Python Asyncio,我试图用Python3Asyncio创建一个概念证明,实现一个定期向服务器发送心跳的客户端,以保持连接的活动性 请注意,服务器只是一个echo服务器,不会关闭连接。但重要的是,客户端能够定期发送心跳信号 以下是当前的实施情况: stream_client.py stream_server.py 问题: 在heartbeat()方法上,self.writer.write('heartbeat.encode())行似乎永远不会执行 如何使其工作?代码正在客户端执行,您只是在服务器端没有任何代码来接收
heartbeat()
方法上,self.writer.write('heartbeat.encode())
行似乎永远不会执行
如何使其工作?代码正在客户端执行,您只是在服务器端没有任何代码来接收消息<代码>服务器处理程序仅在每个连接中调用一次,而不是在每个消息中调用一次。因此,如果您希望它能够从给定的客户端接收无限数量的心跳,则需要在
服务器处理程序
中设置一个循环来接收它们:
@asyncio.coroutine
def server_handler(self, reader, writer):
while True: # Keep receiving data from client.
data = yield from reader.read(15)
msg = data.decode()
if data is not 'bye':
print('Received data: "{}" from {}'.format(msg, writer.get_extra_info('peername')))
print('Echoing the message...')
writer.write(data)
yield from writer.drain()
else:
print('Received data: "{}" from {}'.format(
data,
writer.get_extra_info('peername')
)
)
print('Closing the connection...')
writer.close()
import asyncio
class StreamServer:
def __init__(self, loop=None):
if loop is not None:
self.loop = loop
else:
self.loop = asyncio.get_event_loop()
@asyncio.coroutine
def server_handler(self, reader, writer):
data = yield from reader.read(15)
msg = data.decode()
if data is not 'bye':
print('Received data: "{}" from {}'.format(msg, writer.get_extra_info('peername')))
print('Echoing the message...')
writer.write(data)
yield from writer.drain()
else:
print('Received data: "{}" from {}'.format(
data,
writer.get_extra_info('peername')
)
)
print('Closing the connection...')
writer.close()
loop = asyncio.get_event_loop()
stream_server = StreamServer(loop)
coro_server = asyncio.start_server(
stream_server.server_handler,
'127.0.0.1',
9871,
loop=stream_server.loop
)
server = loop.run_until_complete(coro_server)
print('Listening on:', server.sockets[0].getsockname())
try:
loop.run_forever()
except KeyboardInterrupt:
pass
print('Closing server')
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()
@asyncio.coroutine
def server_handler(self, reader, writer):
while True: # Keep receiving data from client.
data = yield from reader.read(15)
msg = data.decode()
if data is not 'bye':
print('Received data: "{}" from {}'.format(msg, writer.get_extra_info('peername')))
print('Echoing the message...')
writer.write(data)
yield from writer.drain()
else:
print('Received data: "{}" from {}'.format(
data,
writer.get_extra_info('peername')
)
)
print('Closing the connection...')
writer.close()