简体   繁体   English

python3.5异步协议

[英]python3.5 asyncio Protocol

I want to build a chat demo, but I can not receive the server-side things sent, in addition to the first time to start, anyone know why? 我想构建一个聊天演示,但是我不能接收发送的服务器端内容,除了第一次启动之外,有人知道为什么吗? code from https://docs.python.org/3.4/library/asyncio-protocol.html#tcp-echo-client-protocol 来自https://docs.python.org/3.4/library/asyncio-protocol.html#tcp-echo-client-protocol的代码

Server.py Server.py

import asyncio

class EchoServerClientProtocol(asyncio.Protocol):
    def connection_made(self, transport):
        peername = transport.get_extra_info('peername')
        print('Connection from {}'.format(peername))
        self.transport = transport

    def data_received(self, data):
        message = data.decode()
        print('Data received: {!r}'.format(message))
        print('Send: {!r}'.format(message))
        self.transport.write(data)


loop = asyncio.get_event_loop()
# Each client connection will create a new protocol instance
coro = loop.create_server(EchoServerClientProtocol, '127.0.0.1', 8888)
server = loop.run_until_complete(coro)

# Serve requests until Ctrl+C is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
    loop.run_forever()
except KeyboardInterrupt:
    pass

# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()

Client.py Client.py

class EchoClientProtocol(asyncio.Protocol):
    def __init__(self, message, loop):
        self.message = message
        self.loop = loop
        self.transport = None

    def connection_made(self, transport):
        self.transport = transport

        transport.write(self.message.encode())
        print('Data sent: {!r}'.format(self.message))

        # while 1:
        #     message=input('please input the message:')
        #     transport.write(message.encode())
        #     print('Data sent: {!r}'.format(message))

    def data_received(self, data):
        # print('data_received')
        print('Data received: {!r}'.format(data.decode()))
        while 1:
            message = input('please input the message:')
            self.transport.write(message.encode())
            print('Data sent: {!r}'.format(message))

    def connection_lost(self, exc):
        print('The server closed the connection')
        print('Stop the event loop')
        self.loop.stop()

loop = asyncio.get_event_loop()
message = 'Hello World!'
coro = loop.create_connection(lambda: EchoClientProtocol(message, loop),
                              '127.0.0.1', 8888)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()

result show: cant not show 'Data received: '#####' like 'def data_received(self, data)' is only used onece anyone have solution? 结果显示:无法显示'接收到的数据:'#####'像'def data_received(self,data)'仅用于任何人有解决方案吗? [result][1] [1]: https://i.stack.imgur.com/IoqA9.png [结果] [1] [1]: https//i.stack.imgur.com/IoqA9.png

You created so-called blocking function from EchoClientProtocol.data_received() . 您从EchoClientProtocol.data_received()创建了所谓的阻止函数。 Every delivered message from server can be delivered into EchoClientProtocol.data_received() only when the event loop can process it but blocking function prevents it. 仅当事件循环可以处理时,服务器发出的每个消息才可以将其传送到EchoClientProtocol.data_received()中,但阻塞功能阻止了它。

This code 这段代码

while 1: # More Pythonic way is While True
    message = input('please input the message:')
    self.transport.write(message.encode())

get message from user and send it to the server, until this moment it's all fine. 从用户那里获取消息并将其发送到服务器,直到这一刻一切正常。 In the next step it starts another loop but the code never get into the event loop (so the incoming message can't be processed). 在下一步中,它将启动另一个循环,但是代码永远不会进入事件循环(因此无法处理传入的消息)。

You can edit the client code like this: 您可以像这样编辑客户端代码:

    def data_received(self, data):
        print('Data received: {!r}'.format(data.decode()))
        message = input('please input the message:')
        self.transport.write(message.encode())

The data_received in client is first called when you received Hello World! 当您收到Hello World!时,将首先调用客户端中的data_received Hello World! from server (it's the Hello World! sends from connection_made ). 从服务器(这是Hello World!connection_made发送)。 Now the processing is following: 现在处理如下:

  1. It prints received message (in the first call it's Hello World! ) 它打印收到的消息(在第一个呼叫中是Hello World!
  2. Get new message from user 从用户处获取新消息
  3. Send it to the server 发送到服务器
  4. The function returns and the control is given to the event loop. 函数返回,并将控制权交给事件循环。
  5. The server received new message and send it back to client 服务器收到新消息并将其发送回客户端
  6. The event loop on client call data_received 客户端调用data_received上的事件循环
  7. Go to the step 1 转到步骤1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM