簡體   English   中英

python3.5異步協議

[英]python3.5 asyncio Protocol

我想構建一個聊天演示,但是我不能接收發送的服務器端內容,除了第一次啟動之外,有人知道為什么嗎? 來自https://docs.python.org/3.4/library/asyncio-protocol.html#tcp-echo-client-protocol的代碼

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

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()

結果顯示:無法顯示'接收到的數據:'#####'像'def data_received(self,data)'僅用於任何人有解決方案嗎? [結果] [1] [1]: https//i.stack.imgur.com/IoqA9.png

您從EchoClientProtocol.data_received()創建了所謂的阻止函數。 僅當事件循環可以處理時,服務器發出的每個消息才可以將其傳送到EchoClientProtocol.data_received()中,但阻塞功能阻止了它。

這段代碼

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

從用戶那里獲取消息並將其發送到服務器,直到這一刻一切正常。 在下一步中,它將啟動另一個循環,但是代碼永遠不會進入事件循環(因此無法處理傳入的消息)。

您可以像這樣編輯客戶端代碼:

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

當您收到Hello World!時,將首先調用客戶端中的data_received Hello World! 從服務器(這是Hello World!connection_made發送)。 現在處理如下:

  1. 它打印收到的消息(在第一個呼叫中是Hello World!
  2. 從用戶處獲取新消息
  3. 發送到服務器
  4. 函數返回,並將控制權交給事件循環。
  5. 服務器收到新消息並將其發送回客戶端
  6. 客戶端調用data_received上的事件循環
  7. 轉到步驟1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM