1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/gmyth-stream/server/0.1/plugins/comm/tcp.py Wed Jul 04 21:49:50 2007 +0100
1.3 @@ -0,0 +1,79 @@
1.4 +import lib
1.5 +import time
1.6 +import socket
1.7 +import logging as log
1.8 +
1.9 +class Server(object):
1.10 +
1.11 + def __init__(self, config):
1.12 + self.host = '0.0.0.0'
1.13 + self.port = int(config.get("Comm", "port"))
1.14 + self.finish = 0
1.15 +
1.16 + addr = (self.host, self.port)
1.17 + log.debug("Setup TCP server at %s:%s" % addr)
1.18 + self.tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1.19 + self.tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1.20 + self.tcp.bind(addr)
1.21 + self.tcp.listen(1)
1.22 + log.info("TCP server listening at %s:%s (sock=%d)" %
1.23 + (self.host, self.port, self.tcp.fileno()))
1.24 +
1.25 + def getMsg(self):
1.26 + bytes = []
1.27 + try:
1.28 + while 1:
1.29 + c = self.con.recv(1)
1.30 + bytes.append(c)
1.31 + if not c or c == "\n":
1.32 + break
1.33 + except Exception, e:
1.34 + log.error("Error reading message from client: %s" % e)
1.35 + return None
1.36 +
1.37 + if not bytes or bytes[-1] != "\n":
1.38 + msg = "".join(bytes)
1.39 + log.error("Invalid message from client: %r" % msg)
1.40 + return None
1.41 +
1.42 + # remove \n and \r
1.43 + bytes.pop()
1.44 + if bytes[-1] == "\r":
1.45 + bytes.pop()
1.46 +
1.47 + msg = "".join(bytes)
1.48 + log.debug("RECV: %r" % msg)
1.49 + return msg
1.50 +
1.51 + def sendMsg(self, msg):
1.52 + log.debug("SEND: %r" % msg)
1.53 + self.con.send(msg + "\n")
1.54 +
1.55 + def sendOk(self, payload=None):
1.56 + self.sendMsg("OK %d" % bool(payload is not None))
1.57 + if payload is not None:
1.58 + if not isinstance(payload, (tuple, list)):
1.59 + payload = (payload,)
1.60 + for e in payload:
1.61 + self.sendMsg("+%s" % e)
1.62 + self.sendMsg(".")
1.63 +
1.64 + def sendNotOk(self, reason=""):
1.65 + self.sendMsg("NOTOK %r" % reason)
1.66 +
1.67 + def getRequest(self):
1.68 + log.debug("Wait for client request at %s:%s (sock=%d)" %
1.69 + (self.host, self.port, self.tcp.fileno()))
1.70 + self.con, self.client = self.tcp.accept()
1.71 + log.info("Incoming request from %s (con=%s)" %
1.72 + (self.client, self.con.fileno()))
1.73 + return (self.con, self.client, self.port)
1.74 +
1.75 + def disconnect_client(self, connection):
1.76 + log.info("Closed request from %s (con=%s)" %
1.77 + (self.client, self.con.fileno()))
1.78 + connection.close()
1.79 +
1.80 + def stop(self):
1.81 + log.debug("Stop")
1.82 + self.tcp.close()