PYTHON 3.5 Problema al recibir datos en websockets (Librería socket)

Iniciado por Pytness, Septiembre 24, 2016, 09:07:18 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Septiembre 24, 2016, 09:07:18 PM Ultima modificación: Septiembre 25, 2016, 08:52:41 PM por Pytness
Buenas, he hecho un script en python 3.5 para realizar una conexión con websockets:
Python 3.5 code:
Código: python

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:
Código: javascript

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:
Código: php

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
Pytness