2016-06-29 1 views
0

新しいasyncioモジュールをPython 3.5.1から試してみました。私はこれがself.transport.sendto(self.message.encode())self.transport.close()のシーケンスによって引き起こされると考えAsyncio:非常に単純な書き込みと切断のUDPクライアントでの問題

Traceback (most recent call last): 
    File "C:\Users\oxygen\Documents\GitProjects\tests\python\udp\client.py", line 
35, in <module> 
    loop.run_forever() 
    File "C:\Python35-32\lib\asyncio\base_events.py", line 295, in run_forever 
    self._run_once() 
    File "C:\Python35-32\lib\asyncio\base_events.py", line 1218, in _run_once 
    event_list = self._selector.select(timeout) 
    File "C:\Python35-32\lib\selectors.py", line 314, in select 
    r, w, _ = self._select(self._readers, self._writers, [], timeout) 
    File "C:\Python35-32\lib\selectors.py", line 305, in _select 
    r, w, x = select.select(r, w, w, timeout) 
OSError: [WinError 10038] an operation was attempted on something that is not a socket 

:私はこれを実行すると

import asyncio 

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

    def connection_made(self, transport): 
     self.transport = transport 
     print('Send:', self.message) 
     self.transport.sendto(self.message.encode()) 
     self.transport.close() 

    def datagram_received(self, data, addr): 
     print("Received:", data.decode()) 

     print("Close the socket") 
     #self.transport.close() 

    def error_received(self, exc): 
     print('Error received:', exc) 

    def connection_lost(self, exc): 
     print("Socket closed, stop the event loop") 
     loop = asyncio.get_event_loop() 
     loop.stop() 

loop = asyncio.get_event_loop() 
message = "Hello World!" 
connect = loop.create_datagram_endpoint(
    lambda: EchoClientProtocol(message, loop), 
    remote_addr=('127.0.0.1', 9999)) 
transport, protocol = loop.run_until_complete(connect) 
loop.run_forever() 
transport.close() 
loop.close() 

、通訳は私に与える:ここに私のテストコードです。私が正しく理解すれば、sendtoメソッドは非同期で、closeメソッドを呼び出すことでソケットを閉じた後に実際に呼び出されます。これを解決する方法はありますか?

答えて

0

DatagramTransport(実際_SelectorDatagramTransport)スケジュール接続上の2つのアクション、最初のものは、特定のプロトコルからconnection_madeあり、第二は_read_ready(のrecvfrom)である - この順序(https://github.com/python/asyncio/blob/master/asyncio/selector_events.py#L996)で。

connection_madeで輸送を閉じたため、次の操作(_read_ready)が失敗します。そこからself.transport.close()を削除します。

興味深いのは、asyncio udp examplesです。

+0

ご意見ありがとうございます。私のコードは実際にあなたがリンクした例の編集版です。 読書をしないで接続を開く方法について、もう少し助けてください。私は本当に接続を確立し、データを送信して閉じたいと思っています。私はドキュメントで助けを探していましたが、[この方法](https://docs.python.org/3/library/asyncio-stream.html#asyncio.open_connection)が見つかりました。 –

+0

UDPはコネクションレスプロトコル(https://en.wikipedia.org/wiki/User_Datagram_Protocol)です。 – kwarunek

関連する問題