HiveBrain v1.2.0
Get Started
← Back to all entries
patternpythonMinor

implementing simple stream processor with sockets

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
streamsimplewithprocessorsocketsimplementing

Problem

I'm trying to implement simple data streamer in Python with sockets. Consider one server and one or more clients. I just want to read data from server, process it and send it to the client. Here's how I do it now:

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


Obviously, it's stripped down example, but I think you got the idea.
Does anyone have better ideas?

Solution

For the benefit of others (because this answer is two years late):

I had to implement a socket solution rapidly to accommodate testing a feature that required them. Ended up using socketserver to simplify the implementation, i.e., only about a dozen lines were needed.

Example below is pretty much straight out of the socket server docs:

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

Code Snippets

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

Context

StackExchange Code Review Q#6722, answer score: 2

Revisions (0)

No revisions yet.