Buenas, he hecho un script en python 3.5 para realizar una conexión con websockets:
Python 3.5 code:
import base64, hashlib
import socket, threading, time, os
class Connection:
def __init__(self, HOST, PORT):
self.HOST = HOST
self.PORT = PORT
self.magicKey = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
def init(self):
self.socket = socket.socket()
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind((self.HOST, self.PORT));
self.socket.listen(1);
self.conn, self.addr = self.socket.accept();
h = self.conn.recv(1024).decode("utf-8")
print(h)
self.conn.send(bytes(self.header(h).encode("utf-8")))
# threading.Thread(target = self.getData).start()
threading.Thread(target = self.getData).start()
def getKey(self, msg):
msg = msg.split("\r\n")
for x in msg:
if x.count("Sec-WebSocket-Key") != 0:
key = x.split(" ")[1]
hash = hashlib.sha1()
hash.update(bytes((key + self.magicKey).encode("utf-8")))
return base64.b64encode(hash.digest()).decode("utf-8")
def header(self, msg):
finalKey = self.getKey(msg)
print(finalKey)
header = "HTTP/1.1 101 Switching Protocols\r\n"
header += "Upgrade: websocket\r\n"
header += "Connection: Upgrade\r\n"
header += "Sec-WebSocket-Accept: " + finalKey + "\r\n"
header += "\r\n"
return header
def getData(self):
while True:
data = self.conn.recv(1024)
print(str(data))
def sendData(self):
# while True:
enviar = bytes("Test \n".encode("utf-8"))
self.conn.sendall(enviar)
connection = Connection("localhost", 7899)
connection.init()
JS Code:
function send(data) {
ws.send(data);
}
var op = document.getElementById("output");
op.innerHTML = '';
ws = new WebSocket('ws://localhost:7899');
ws.onopen = function (evt) {
op.innerHTML += "Open <br>";
send("test")
};
ws.onclose = function (evt) {
op.innerHTML += "Closed <br>";
};
ws.onmessage = function (evt) {
op.innerHTML += "<pre>" + evt.data + "</pre><br>";
};
ws.onerror = function (evt) {
op.innerHTML += "Error <br>";
};
E aquí la respuesta que obtengo en la consola al conectarme:
GET / HTTP/1.1
Host: localhost:7899
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: file://
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: es-ES,es;q=0.8
Sec-WebSocket-Key: rrbq+deqlkTqFTSZ4qEyGQ==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
TAPFySA27bL6vQ7S8bsd4ve14ZY=
b'\x81\x84\x95\x91P\x05\xe1\xf4#q'
El problema está en que yo mando con js 'test' y recibo b'\x81\x84\x95\x91P\x05\xe1\xf4#q' en consola.
He intentado decodificarlo a utf-8 pero da error.
Espero que sepan y puedan ayudarme.
Gracias.
-Pytness