summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/client.py31
-rw-r--r--server/piztor_server.py126
2 files changed, 157 insertions, 0 deletions
diff --git a/server/client.py b/server/client.py
new file mode 100644
index 0000000..b1a6d86
--- /dev/null
+++ b/server/client.py
@@ -0,0 +1,31 @@
+import socket
+import sys
+from struct import *
+
+HOST, PORT = "localhost", 9999
+data = ""
+
+sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+#data = pack("!B", 0)
+#data += "hello"
+#data += "\0"
+#data += "world"
+
+#data = pack("!Bll", 1, 1234, 5678)
+#data += "hello, world!"
+
+data = pack("!Bldd", 2, 1234, 123.123, 12323.23222)
+print data
+
+try:
+
+ sock.connect((HOST, PORT))
+ sock.sendall(data)
+ sock.shutdown(socket.SHUT_WR)
+ received = sock.recv(1024)
+finally:
+ sock.close()
+
+print "Sent: {}".format(data)
+print "Received: {}".format(received[0])
diff --git a/server/piztor_server.py b/server/piztor_server.py
new file mode 100644
index 0000000..3809f22
--- /dev/null
+++ b/server/piztor_server.py
@@ -0,0 +1,126 @@
+import sqlalchemy
+import SocketServer
+import socket
+import select
+import time
+import struct
+
+class PiztorError(Exception):
+ def __init__(self, msg):
+ self.err_msg = msg
+ def __str__(self, msg):
+ return self.err_msg
+
+class ConnectionError(PiztorError):
+ pass
+
+class ReqReadError(ConnectionError):
+ def __init__(self):
+ super(ReqReadError, self).__init__("Error while reading request")
+
+class ReqInvalidError(ConnectionError):
+ def __init__(self):
+ super(ReqInvalidError, self).__init__("Invalid request")
+
+class DataManager(object):
+ pass
+
+class UserManager(DataManager):
+ def handle(self, opt_type, data):
+ print "Parsing User Data"
+ pos = -1
+ for i in xrange(0, len(data)):
+ if data[i] == '\0':
+ print i
+ if pos != -1:
+ raise ReqInvalidError()
+ pos = i
+ break
+ if pos == -1:
+ raise ReqInvalidError()
+ username = data[0:pos]
+ password = data[pos + 1:]
+ print (username, password)
+ return struct.pack("!Bl", 0, 1234)
+
+
+class MesgManager(DataManager):
+ def handle(self, opt_type, data):
+ print "Parsing Mesg Data"
+ try:
+ if len(data) < 8:
+ raise ReqInvalidError()
+ sender_token, recv_id = struct.unpack("!ll", data[:8])
+ msg = data[8:]
+ print (sender_token, recv_id, msg)
+ return struct.pack("!B", 1)
+ except struct.error:
+ raise ReqInvalidError()
+
+class LocationManager(DataManager):
+ def handle(self, opt_type, data):
+ print "Parsing Loc Data"
+ try:
+ if len(data) < 8:
+ raise ReqInvalidError()
+ sender_token, lat, lont = struct.unpack("!ldd", data)
+ print (sender_token, lat, lont)
+ return struct.pack("!B", 2)
+ except struct.error:
+ raise ReqInvalidError()
+
+
+
+class PiztorServer():
+
+ mgr_map = [ UserManager(),
+ MesgManager(),
+ LocationManager() ]
+
+ class GenericHandler(SocketServer.StreamRequestHandler):
+
+ def handle(self):
+ sock = self.request
+ sock.setblocking(0)
+ data = ""
+ while True:
+ ready = select.select([sock], [], [], 1)
+ if not ready[0]:
+ raise ReqReadError()
+ buff = sock.recv(4096)
+ if len(buff) == 0:
+ break # terminated
+ else:
+ data += buff
+ sock.shutdown(socket.SHUT_RD)
+
+ print "Got the data:"
+ print data
+ print "===="
+
+ if len(data) < 1:
+ raise ReqInvalidError()
+ opt_id = struct.unpack("!B", data[0])[0]
+ reply = PiztorServer.mgr_map[opt_id].handle(
+ opt_id, data[1:])
+ sock.sendall(reply)
+ sock.close()
+
+ def __init__(self, host, port):
+ srv = SocketServer.TCPServer((host, port),
+ PiztorServer.GenericHandler)
+ srv.timeout = 2
+ self.server = srv
+
+
+ def run(self):
+ try:
+ self.server.serve_forever()
+ except KeyboardInterrupt:
+ print "Exiting..."
+ self.server.shutdown()
+ print "Server shutdown"
+
+if __name__ == "__main__":
+ ps = PiztorServer("localhost", 9999)
+ ps.run()