2016-05-28 10 views
0

私は、非侵襲的なTCPサーバーとソケットを使用してネットワークをシミュレートしようとしています。私はexample from documentationを私の仕事の出発点として使用しました。ここに私のサーバークラスのコードは次のとおりです。Python非同期TCPサーバー:そこからソケットを取得できません

import asyncio 
import socket 
import Node 

class ServerProtocol(asyncio.Protocol): 
    def __init__(self, hostNode): 
     self.hostNode = hostNode 

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

    def data_received(self, data): 
     print('Data received: {!r}'.format(data)) 
     self.hostNode.processIncomingMessage(data) 

class NodeServer: 
    def __init__(self, hostNode): 
     self.loop = asyncio.get_event_loop() 
     self.hostNode = hostNode 

    def startListening(self): 
     self.coro = self.loop.create_server(ServerProtocol(self.hostNode), '', 0, family=socket.AF_INET) 
     server = self.loop.run_until_complete(self.coro) 

    def getPortNumber(self): 
     print(self.coro.sockets) 
     portNumber = self.coro.sockets[0].getpeername()[1] 
     print(portNumber) 
     return portNumber 

Iは、IPv4バージョンを確立する必要があるとOSを聞くために、適切なランダムなポートを与えなければならないので、私はのparams ''0family=socket.AF_INETcreate_server関数を呼び出します。下のコードでは、私はいくつかのポートを取得しようとしています。 Documentation sayscreate_server関数はServerオブジェクト、sockets can be retrievedsockets属性から戻します。 しかし、私は、コードを実行したときに、私は次のエラーを取得:だからself.coro.sockets

を実行するときに

AttributeError: 'generator' object has no attribute 'sockets' 

をそれが起こる、それが問題です。

誰か助けてくれますか?

多くのありがとうございます。

答えて

1

create_serverを呼び出すと、コルーチンが返されます。 run_until_completeを呼び出すと、sockets属性を持つサーバーインスタンスが返されます。 startListeningの定義を変更して戻り値run_until_completeself.serverとして保存し、代わりにgetPortNumberの定義を変更してください。また、ポートを割り当てるには、getpeernamegetsocknameに変更する必要があります。

class NodeServer: 
    def __init__(self, hostNode): 
     self.loop = asyncio.get_event_loop() 
     self.hostNode = hostNode 

    def startListening(self): 
     self.coro = self.loop.create_server(ServerProtocol(self.hostNode), '', 0, family=socket.AF_INET) 
     self.server = self.loop.run_until_complete(self.coro) 

    def getPortNumber(self): 
     print(self.server.sockets) 
     portNumber = self.server.sockets[0].getsockname()[1] 
     print(portNumber) 
     return portNumber 
+0

ありがとうございました。それは本当にひどかった。別の質問をすることはできますか? –

関連する問題