2016-05-28 3 views
0

Ich versuche, ein Netzwerk mit asynchron TCP-Servern und Sockets zu simulieren. Ich habe einen example from documentation als Ausgangspunkt für meine Aufgabe verwendet. Hier ist der Code meiner Serverklasse:Python Async-TCP-Server: kann keine Sockets aus ihm

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 

Ich nenne create_server Funktion mit params '', 0 und family=socket.AF_INET weil ich brauche IPv4-Version zu etablieren und das Betriebssystem muß entsprechendes zufälliges Port geben zu hören. Im folgenden Code versuche ich eine Anzahl von Ports zu bekommen. Documentation says, create_server Funktion gibt Server Objekt und sockets can be retrieved von sockets Attribut zurück. Aber , wenn ich den Code ausführen, erhalte ich Fehler folgende:

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

Es passiert, wenn self.coro.sockets

So Ausführung, das ist das Problem.

Könnte mir bitte jemand dabei helfen?

Vielen Dank.

Antwort

1

Der Aufruf an create_server gibt eine Coroutine zurück. Die Serverinstanz mit dem Attribut sockets wird zurückgegeben, wenn Sie run_until_complete aufrufen. Ändern Sie die Definition von startListening, um den Rückgabewert run_until_complete als self.server zu speichern, und ändern Sie stattdessen Ihre getPortNumber Definition, um diese zu verwenden. Sie müssen auch getpeername zu getsockname ändern, um den zugewiesenen Port zu erhalten.

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

Danke. Es hat wirklich gekippt. Kann ich dir eine andere Frage stellen? –

Verwandte Themen