WebSocket javascript client et python. Récupération des ordures dans la production

J'essaie d'envoyer des données de chaîne / texte du client du navigateur vers le serveur python et de l'imprimer simplement. J'ai suivi plusieurs exemples sur Internet, et tous sont identiques: en utilisant javascript

 web_socket.send("text to be sent") 

Et (python)

 data = web_socket.recv(1024) print data 

Ils reçoivent ce qu'ils veulent, ce qui est clair et agréable "texte à envoyer" imprimé sur le site du serveur.

Vous pouvez trouver mon .html et .py ci-dessous:

 <!DOCTYPE html> <html lang="en"> <head> <title>Test</title> <script src="jquery.js"></script> <script type="application/javascript"> var ws; function init() { var servermsg = document.getElementById("servermsg"); ws = new WebSocket("ws://127.0.0.1:9877/"); ws.onopen = function(){ servermsg.innerHTML = servermsg.innerHTML + "<br>Server connected"; }; ws.onmessage = function(e){ servermsg.innerHTML = servermsg.innerHTML + "<br><< Recieved data: " + e.data; }; ws.onclose = function(){ servermsg.innerHTML = servermsg.innerHTML + "<br>Server disconnected"; }; } function postmsg(){ var text = document.getElementById("message").value; ws.send(text); servermsg.innerHTML = servermsg.innerHTML + "<br>>> Data sent: " + text; } //$(function(){ // var text = document.getElementById("message").value; // ws.send(text); // servermsg.innerHTML = servermsg.innerHTML + "<br>Sent: " + text; //}); </script> </head> <body onload="init();"> <form action="" onSubmit="postmsg();return false;"> <input type="text" name="message" value="" id="message"> <input type="submit" name="submit" value="" id="submit"> </form> <div id="servermsg"><h1>Message log:</h1></div> </body> </html> 

Serveur:

 #!/usr/bin/env python import socket import threading import struct import hashlib import base64 PORT = 9877 _address = "" def create_handshake_resp(handshake): final_line = "" lines = handshake.splitlines() for line in lines: parts = line.partition(": ") if parts[0] == "Sec-WebSocket-Key": key = parts[2] magic = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' accept_key = base64.b64encode(hashlib.sha1(key+magic).digest()) return ( "HTTP/1.1 101 Switching Protocols\r\n" "Upgrade: WebSocket\r\n" "Connection: Upgrade\r\n" "Sec-WebSocket-Accept: " + accept_key + "\r\n\r\n") def handle(s, addr): data = s.recv(1024) response = create_handshake_resp(data) s.sendto(response, addr) lock = threading.Lock() while 1: print "Waiting for data from", addr data = s.recv(1024) print "Done" if not data: print "No data" break print 'Data from', addr, ':', data print 'Client closed:', addr lock.acquire() clients.remove(s) lock.release() s.close() def start_server(): print 'STARTING SERVER...' s = socket.socket() s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', PORT)) s.listen(1) print 'SERVER STARTED' while 1: conn, addr = s.accept() print 'NEW CONNECTION ['+str(len(clients))+'], connected by ', addr clients.append(conn) threading.Thread(target = handle, args = (conn, addr)).start() clients = [] start_server() 

Et l'impression du serveur (lorsque l'entrée était "AA" ou "ABC"):

 STARTING SERVER... SERVER STARTED NEW CONNECTION [0], connected by ('127.0.0.1', 43877) Waiting for data from ('127.0.0.1', 43877) Done Data from ('127.0.0.1', 43877) :     w q Waiting for data from ('127.0.0.1', 43877) Done Data from ('127.0.0.1', 43877) :   )B h Waiting for data from ('127.0.0.1', 43877) 

Je travaille sur quelque chose de semblable moi-même. Le protocole Websocket exige que le client envoie toutes ses données à l'aide d'un masque. C'est pourquoi vous voyez «ordures» – c'est le texte masqué.

http://tools.ietf.org/html/rfc6455#section-5

"Un client DOIT masquer toutes les images qu'il envoie au serveur"

Lisez la section 5 du protocole et tout sera clair. Le navigateur (c.-à-d. Le client) est en train de mettre en œuvre le protocole comme il se doit (lorsque vous appelez ws.send). Vous devez faire votre part.

Notez également que lorsque le grave envoie des données au client, il NE doit PAS masquer. Mais il doit toujours fournir d'autres informations avant les données réelles (type, longueur, etc.).

Pour envoyer un message du côté du serveur au client websocket, vous devez faire comme suit:

 message = bytearray([0b10000001, len(original_msg)]) for byte in bytearray(original_msg): message.append(byte) 

Voir un serveur stable vers une bibliothèque de socket unidirectionnelle client à https://github.com/westial/SingleSocket

Le problème avec les données indésirables était que le code javascript envoie les données masquées et que vous devez démasquer le côté du serveur et que le serveur envoie les données non masquées au côté client. Pour résoudre ce problème, consultez ma page git-hub [] [1] https : //github.com/mohanbe/web-chat