def open(self): #init self.sessionManager = None self._latency = [] try: user = user_from_session_key(get_cookies(self)['sessionid']) except KeyError as ke: logging.error("No sessionid in cookies") self.close() return None if user != None: #if the client has a user logged in logging.info("user: %s" % user.username) self.sessionManager = WhalesSessionManager.find_manager_by_user(user) if self.sessionManager == None: self.sessionManager = WhalesSessionManager(self) #new manager for user logging.info("creating new sessionManager") else: self.sessionManager.join(self) logging.info("found old sessionManager") logging.info(self.sessionManager.managers) ChatSocketHandler.connections.append(self) else: try: self.close() except: pass
class ChatSocketHandler(tornado.websocket.WebSocketHandler): _latency_size = 3 #set this to something like 3-5 when not testing connections = [] #this is deprecated. Now we use WhalesSessionManager.syncronize @classmethod def syncronization(cls, lock): while True: time.sleep(10) #sleep time makes sense when about 10-20 lock.acquire() for connection in cls.connections: try: connection.send_ping() except: logging.info("could not send ping") lock.release() def latency(self): return float(sum(self._latency) / len(self._latency)) def open(self): #init self.sessionManager = None self._latency = [] try: user = user_from_session_key(get_cookies(self)['sessionid']) except KeyError as ke: logging.error("No sessionid in cookies") self.close() return None if user != None: #if the client has a user logged in logging.info("user: %s" % user.username) self.sessionManager = WhalesSessionManager.find_manager_by_user(user) if self.sessionManager == None: self.sessionManager = WhalesSessionManager(self) #new manager for user logging.info("creating new sessionManager") else: self.sessionManager.join(self) logging.info("found old sessionManager") logging.info(self.sessionManager.managers) ChatSocketHandler.connections.append(self) else: try: self.close() except: pass def on_close(self): logging.info("client disconnected") try: ChatSocketHandler.connections.remove(self) self.sessionManager.depart(self) except KeyError as ke: print ke def on_message(self, message): #print "got message: %r" % message try: package = decode(message) package['time']['recived'] = millitime() except ValueError as e: print type(e) print e return self.handle_latency(package) # allways handle latency from clients #let this connections manager #check if type is a system handled type. otherwise, let session handle if package['type'] not in ["pong"]: if self.sessionManager == None: self.close() return self.sessionManager.handle_package(package, self) def handle_latency(self, package): #latency calculations self._latency.append((int(millitime()) - package['time']['sent'])) if len(self._latency) > self._latency_size: self._latency = self._latency[self._latency_size:] #find out what client the package came from if package['from'] == "server": #server sent the initial ping. set time at client delay = (millitime() - package['time']['created']) / 2 #2xping / 2 #logging.info("expected delay to client: %d" % (delay)) self.send_time(delay) else: pongBy = package['from'] logging.info ("[LATENCY] %s to server: %d ms" % (pongBy, self.latency())) def send_ping(self): pingPack = SyncObject("ping") self.send_package(pingPack) def send_time(self, initalDelay=0): timePack = SyncObject("synctime") timePack.package['payload']['settime'] = int(millitime()) + initalDelay self.send_package(timePack) def send_package(self, package): package.package['time']['sent'] = int(millitime()) self.write_message(str(package))