|
@@ -42,28 +42,18 @@ class ConnHandlerBase(object):
|
|
|
self.block_size = 1024
|
|
|
self.welcome_client()
|
|
|
self.status="connected"
|
|
|
+
|
|
|
def welcome_client(self):
|
|
|
pass
|
|
|
- def handle(self, data_decoded):
|
|
|
+
|
|
|
+ def handle(self, data):
|
|
|
return
|
|
|
+
|
|
|
def recv(self):
|
|
|
data_received = self.socket.recv(self.block_size)
|
|
|
data_decoded = data_received.decode("utf-8")
|
|
|
return data_decoded
|
|
|
- # def recv(self):
|
|
|
- # try:
|
|
|
- # data_received = self.socket.recv(self.block_size)
|
|
|
- # data_decoded = data_received.decode("utf-8")
|
|
|
- # if data_decoded:
|
|
|
- # lschat.info("Client:"+data_decoded.strip())
|
|
|
- # self.handle(data_decoded)
|
|
|
- # return True
|
|
|
- # else:
|
|
|
- # lserver.debug("connection corrupted")
|
|
|
- # return False
|
|
|
- # except Exception as e:
|
|
|
- # lserver.error(e, exc_info=True)
|
|
|
- # return False
|
|
|
+
|
|
|
def send(self, msg):
|
|
|
msg_encoded = bytes(msg, "utf-8")
|
|
|
lschat.info("Server:"+msg)
|
|
@@ -73,16 +63,17 @@ class ConnHandlerBase(object):
|
|
|
except Exception as e:
|
|
|
lserver.error(e, exc_info=True)
|
|
|
return False
|
|
|
+
|
|
|
def close(self):
|
|
|
self.status = "closed"
|
|
|
try:
|
|
|
self.socket.shutdown(0)
|
|
|
except:
|
|
|
- lserver.error("error during socket shutdown, ignoring")
|
|
|
+ lserver.debug("error during socket shutdown")
|
|
|
try:
|
|
|
self.socket.close()
|
|
|
except:
|
|
|
- lserver.error("error closing socket, maybe already closed")
|
|
|
+ lserver.debug("error closing socket")
|
|
|
|
|
|
|
|
|
class ConnHandlerEcho(ConnHandlerBase):
|
|
@@ -93,10 +84,10 @@ class ConnHandlerEcho(ConnHandlerBase):
|
|
|
self.server = server
|
|
|
def welcome_client(self):
|
|
|
self.send("welcome to the client")
|
|
|
- def handle(self, data_decoded):
|
|
|
- lschat.info("Client:"+data_decoded)
|
|
|
+ def handle(self, data):
|
|
|
+ lschat.info("Client:"+data)
|
|
|
for h in list(set(self.server.connection_handler)-{self}):
|
|
|
- h.send(data_decoded)
|
|
|
+ h.send(data)
|
|
|
|
|
|
class Server(object):
|
|
|
"""docstring for SocketHandler"""
|
|
@@ -127,6 +118,7 @@ class Server(object):
|
|
|
self.read_sockets_expected = [self.socket]
|
|
|
self.write_sockets_expected = []
|
|
|
self.exc_sockets_expected = []
|
|
|
+
|
|
|
def make_socket(self):
|
|
|
lserver.debug("making a {} socket".format(self.af_family))
|
|
|
if self.af_family == "AF_INET":
|
|
@@ -139,8 +131,10 @@ class Server(object):
|
|
|
self.af_family
|
|
|
)
|
|
|
)
|
|
|
+
|
|
|
def make_handler(self, conn, addr):
|
|
|
return self.handler(conn, addr, self, **self.handler_kwargs)
|
|
|
+
|
|
|
def register_conn(self, conn, addr):
|
|
|
# if self.log_ip:
|
|
|
# lserver.info("New connection from {} on port {}".format(*addr))
|
|
@@ -148,20 +142,24 @@ class Server(object):
|
|
|
if addr:
|
|
|
self.conn_to_addr[conn] = addr
|
|
|
self.addr_to_conn[addr] = conn
|
|
|
+
|
|
|
def unregister_conn(self, conn):
|
|
|
self.read_sockets_expected.remove(conn)
|
|
|
addr = self.conn_to_addr.get(conn, False)
|
|
|
if addr:
|
|
|
del self.addr_to_conn[addr]
|
|
|
del self.conn_to_addr[conn]
|
|
|
+
|
|
|
def register_handler(self, handler, conn):
|
|
|
self.connection_handler.append(handler)
|
|
|
self.conn_to_handler[conn] = handler
|
|
|
self.handler_to_conn[handler] = conn
|
|
|
+
|
|
|
def unregister_handler(self, handler, conn):
|
|
|
self.connection_handler.remove(handler)
|
|
|
del self.conn_to_handler[conn]
|
|
|
del self.handler_to_conn[handler]
|
|
|
+
|
|
|
def setup(self):
|
|
|
lserver.info("setting up socket")
|
|
|
if self.af_family == "AF_INET":
|
|
@@ -174,6 +172,7 @@ class Server(object):
|
|
|
self.socket.bind(self.host)
|
|
|
self.socket.listen(self.max_allowed_clients)
|
|
|
# self.socket.settimeout(1)
|
|
|
+
|
|
|
def run(self):
|
|
|
self.setup()
|
|
|
lserver.debug("entering main loop")
|
|
@@ -193,12 +192,9 @@ class Server(object):
|
|
|
if ( s == self.socket ):
|
|
|
lserver.debug("handling new client")
|
|
|
conn, addr = self.socket.accept()
|
|
|
- lserver.info(
|
|
|
- "New connection from {} on port {}".format(*addr))
|
|
|
- lserver.debug("peername: '{}', sockname: '{}'".format(
|
|
|
- conn.getpeername(),
|
|
|
- conn.getsockname(),
|
|
|
- ))
|
|
|
+ if self.log_ip:
|
|
|
+ lserver.info(
|
|
|
+ "New connection from {} on port {}".format(*addr))
|
|
|
handler = self.make_handler(conn, addr)
|
|
|
self.register_conn(conn, addr)
|
|
|
self.register_handler(handler, conn)
|
|
@@ -221,6 +217,7 @@ class Server(object):
|
|
|
lserver.debug("else!")
|
|
|
lserver.debug(socket_handler)
|
|
|
time.sleep(1)
|
|
|
+
|
|
|
def cleanup(self):
|
|
|
pass
|
|
|
|