i building small socket server in python, , web-based client using websocket javascript api, , connection keeps closing after send first message. tryed connecting //echo.websocket.org , sending message , there's no problem there. i've read error meant low-level implementation error, i'm assuming comes server, may doing handshake wrong. here client code:
function init_game(){ socket = new websocket('ws://localhost:3003'); //socket = new websocket('ws://echo.websocket.org'); setupsocket(); } function setupsocket(){ socket.onopen = function(){ console.log('connection open !'); var msg = {cmd: 'hello', params: {}}; var data = json.stringify(msg); console.log('sending : ' + data); socket.send(data); }; socket.onmessage = function(e){ var data = e.data; console.log('received : ' + data); handle(data); }; socket.onerror = function(e){ console.log('error : ' + e.code + " - " + e.reason); }; socket.onclose = function(e){ console.log('connection closed : ' + e.code + " - " + e.reason); } } function handle(data){ //doing stuff } window.onload = init_game; and here server code:
class clientthread(threading.thread): # constructor def __init__(self, conn, id, q): threading.thread.__init__(self) self.conn_ = conn self.id_ = id self.name_ = '' self.q_ = q self.handshaken_ = true self.encoded_ = false # main loop def run(self): raw_data = self.conn_.recv(1024) if raw_data[:3] == 'get': self.handshaken_ = false self.handshake(raw_data) while true: raw_data = self.conn_.recv(1024) if len(raw_data) == 0: continue if self.handshaken_: if self.encoded_: raw_data = self.decode(raw_data).decode('utf-8') try: data = json.loads(raw_data) cmd = data['cmd'] params = data['params'] self.handle(cmd, params) except valueerror, e: print 'data received not json' else: print 'received handshake not done yet... going wrong.' # decode encoded message received frmo client def decode(self, data): frame = bytearray(data) length = frame[1] & 127 indexfirstmask = 2 if length == 126: indexfirstmask = 4 elif length == 127: indexfirstmask = 10 indexfirstdatabyte = indexfirstmask + 4 mask = frame[indexfirstmask:indexfirstdatabyte] = indexfirstdatabyte j = 0 decoded = [] while < len(frame): decoded.append(frame[i] ^ mask[j%4]) += 1 j += 1 return "".join(chr(byte) byte in decoded) # performs handshake protocole in case it's needed def handshake(self, get): websocket_answer = ( 'http/1.1 101 switching protocols', 'upgrade: websocket', 'connection: upgrade', 'sec-websocket-accept: {key}\r\n\r\n', ) guid = "258eafa5-e914-47da-95ca-c5ab0dc85b11" raw_key = re.search('sec-websocket-key:\s+(.*?)[\n\r]+', get) if raw_key != none: # create handshake answer... key = raw_key.groups()[0].strip() handshake_key = b64encode(sha1(key + guid).digest()) handshake = '\r\n'.join(websocket_answer).format(key=handshake_key) # , send client self.conn_.send(handshake) self.handshaken_ = true self.encoded_ = true else: print 'no key found during handshake.' self.disconnect() # handle json commands send client def handle(self, cmd, params): # doing stuff def disconnect(self): print 'disconnecting.' pass class mainserver(threading.thread): def __init__(self): threading.thread.__init__(self) self.host = '' self.port = 3003 self.socket_ = socket.socket(socket.af_inet, socket.sock_stream) try: self.socket_.bind((self.host, self.port)) except socket.error msg: print 'bind failed. error code : ' + str(msg[0]) + ' message ' + msg[1] sys.exit() self.clients_ = {1: player(1), 2: player(2)} self.q_ = queue() def run(self): self.socket_.listen(10) nb_player = 0 new_id = 1 while nb_player < 2: conn, addr = self.socket_.accept() print 'a new player connected ' + addr[0] + ':' + str(addr[1]) self.clients_[new_id].conn = conn th = clientthread(conn, new_id, self.q_) th.start() new_id += 1 nb_player += 1 while true: data = self.q_.get(block=true) self.handle(data['cmd'], data['params']) def handle(self, cmd, params): # doing stuff if __name__ == '__main__': serv = mainserver() serv.start() please tell me if need other information. ! robin
Comments
Post a Comment