Implementierung eines einfachen Stream-Prozessors mit Sockets

  • Ich versuche, einfachen Datenstreamer in Python mit Sockets zu implementieren. Betrachten Sie einen Server und einen oder mehrere Clients. Ich möchte nur Daten vom Server lesen, verarbeiten und an den Client senden. So mache ich es jetzt:

             outputsocket = socket.socket()
            outputsocket.bind((self.outputaddress, self.outputport))
            outputsocket.listen(2)
            inputsocket = socket.socket()
            rsocks, wsocks = [], []
            rsocks.append(outputsocket)
            rsocks.append(inputsocket)
            recv_data = []
    
            try:
                inputsocket.connect((self.inputaddress, self.inputport))
                while True:
                    try:
                        reads, writes, errs = select.select(rsocks, [], [])
                    except:
                        return
                    for sock in reads:
                        if sock == outputsocket:
                            client, address = sock.accept()
                            wsocks.append(client)
                        elif sock == inputsocket:
                            data_from_socket = sock.recv(8192)
    
                    if data_from_socket:
                        outdata = process_data(data_from_socket)
                        if wsocks:
                           reads, writes, errs = select.select([], wsocks, [], 0)
                           for sock in writes:
                               sock.send(outdata)
            except KeyboardInterrupt:
                inputsocket.close()
                outputsocket.close()
                # etc
     

    Offensichtlich ist dies ein Beispiel, aber ich glaube, Sie haben die Idee Hat jemand bessere Ideen?

    11 December 2011
    qutron
1 answer
  • Zum Vorteil anderer (weil diese Antwort zwei Jahre zu spät kommt):

    Ich musste schnell eine Socket-Lösung implementieren, um das Testen einer Funktion zu ermöglichen, die sie benötigt . Am Ende benutzte man socketserver , um die Implementierung zu vereinfachen, dh es waren nur etwa ein Dutzend Zeilen benötigt.

    Das folgende Beispiel ist aus den Socket-Server-Dokumenten ziemlich direkt:

     """ creates, activates a socket server """
    import socketserver
    
    HOST, PORT = "localhost", 9999
    
    
    class MyTCPHandler(socketserver.BaseRequestHandler):
        def handle(self):
            # self.request is the TCP socket connected to the client
            self.data = self.request.recv(1024).strip()
            print("{} wrote:".format(self.client_address[0]))
            print(self.data)
            # just send back the same data, but upper-cased
            self.request.sendall(self.data.upper())
    
    
    print("Creating the server, binding to localhost on port", PORT)
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
    
    
    def activate_server():
        server.serve_forever()
    
    
    def stop_server():
        print("Shutting the server on port", PORT)
        server.shutdown()
    
    
    if __name__ == "__main__":
        activate_server()
     
    17 December 2013
    Simon Minshall