7 from threading import Thread
11 logger = logging.getLogger(__name__)
13 class NetServer(Thread):
14 def __init__(self, handler=None, handler_connect=None, handler_disconnect=None):
17 self.sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
18 self.sck.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
19 self.sck.bind(("", 10001))
21 self.sck.setblocking(0)
23 self.handler = handler
24 self.handler_connect = handler_connect
25 self.handler_disconnect = handler_disconnect
33 conn, addr = self.sck.accept()
34 #conn.settimeout(0.01)
37 logger.debug("New Connection")
38 proto = Protocol(NetWrapper(conn))
39 if self.handler_connect:
40 self.handler_connect(proto)
43 addr, msg = proto.receive()
44 except socket.error, e:
46 logger.debug("Connection lost")
48 logger.debug("Socket Error %d", e.errno)
49 traceback.print_exc(file=sys.stdout)
51 except TimeoutException:
58 traceback.print_exc(file=sys.stdout)
63 self.handler(addr, msg)
65 traceback.print_exc(file=sys.stdout)
66 logger.debug("Connection Ended")
67 if self.handler_disconnect:
68 self.handler_disconnect(proto)
76 def __init__(self, sck):
80 return self.sck.send(s)
83 return self.sck.recv(i)
86 return self.sck.close()
88 class NetClient(Protocol, Thread):
89 def __init__(self, kTarget, handler=None):
92 self.comm = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
93 self.comm.connect(kTarget)
94 self.comm.setblocking(0)
95 self.comm.settimeout(0.01)
96 Protocol.__init__(self, NetWrapper(self.comm))
97 self.handler = handler
105 addr, msg = self.receive()
107 self.handler(addr, msg)
108 except socket.error, e:
109 if hasattr(e, "errno") and e.errno == 9:
110 #print "Connection lost"
112 elif e.message == "timed out":
115 traceback.print_exc(file=sys.stdout)
116 except TimeoutException:
119 traceback.print_exc(file=sys.stdout)
127 return Protocol.receive(self)
137 if __name__ == "__main__":
138 def handler(addr, s):
141 if sys.argv[1] == "server":
142 pNet = NetServer(handler)
145 elif sys.argv[1] == "client":
146 pNet = NetClient(("192.168.36.14", 10001))
147 pNet.send(0, "lights")