Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python asyncio-heartbeat()方法未写入流_Python_Python 3.x_Concurrency_Python Asyncio - Fatal编程技术网

Python asyncio-heartbeat()方法未写入流

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())行似乎永远不会执行 如何使其工作?代码正在客户端执行,您只是在服务器端没有任何代码来接收

我试图用Python3Asyncio创建一个概念证明,实现一个定期向服务器发送心跳的客户端,以保持连接的活动性

请注意,服务器只是一个echo服务器,不会关闭连接。但重要的是,客户端能够定期发送心跳信号

以下是当前的实施情况:

stream_client.py stream_server.py 问题: 在
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()