Autor Zpráva
TomasJ
Profil
Zdravím, úvodem bych chtěl říct, že jsem si vědom toho, že pro Node.js existuje přímo WebSocket modul, který dokáže spustit server, ale chci umět i jiné postupy, v node.js začínám, takže je to pro mě zdokonalování.

Skoro celý den se snažím zprovoznit pod TCP protokolem WebSocket server v Node.js (JS na straně serveru).

Teda TCP server mi problém nedělal, u "podávání rukou" jsem strávil chvíli času, protože jsem posílal špatně "Sec-WebSocket-Accept" klíč. Nicméně i tohle jsem zvládl a zasekl jsem se na dekódování dat.

Půl dne studuji strukturu rámce Web Socket, řekl bych, že to mám i správně, ale data se posílají chaoticky.
Na internetu jsem našel jednoduchý WebSocket klient, přes který posílám zprávy.
Ale dost bylo keců, hodím kód na dekódování zprávy a za to několik přijatých zpráv:

function unmask(data) {
    var masks,nData;
    var len = data[1].charCodeAt(0) & 0x7F; //7 bitů z 2. bajtu
    if(len == 126){ //pokud délka packetu je 126, od 3. bajtu jsou 2 bajty délka "Extended payload"
        masks = data.substr(4, 4); //4 bajty po délce "Extended payload" - platí i pro len == 127 a else větev
        nData = data.substr(8); //od 9. bajtu začínají data
    }
    else if(len == 127){ //pokud délka je 127, od 3. bajtu je 8 bajtů délka "Extended payload"
        masks = data.substr(10, 4); //4 bajty po délce
        nData = data.substr(14); //od 15. bajtu začínají data
    }
    else{ //pokud délka je jiná (125 a míň), od 3. bajtu začíná maska dat
        masks = data.substr(2, 4); //4 bajty po 3. bajtu
        nData = data.substr(6); //od 7. bajtu začínají data
    }
    data = "";
    for(var i=0; i<nData.length; i++){
         data += String.fromCharCode(nData[i].charCodeAt(0) ^ masks[i%4].charCodeAt(0)); //přiznám se, že absolutně nevím, jaký je účel toho modula tam, každopádně bez celočíselného dělení to nejde vůbec
    }
    return data;
}
Kód jsem dal dohromady podle nalezených PHP skriptů z internetu a podle příručky k popisu rámce WebSocketů.

Serveru posílám zprávu Nick: Zprava a server mi na to odpovídá takto:
 ?   ??
?? ??? ???
Nic : Z rav
N   :? ??
N c : Z r v
i  t   <a
 i? ??  ??
Nick: Zprava
 ???  ????
Ni k:  pra a
Ni??A? ? ?
?   ?   ?
Z 12 zpráv 1 rozlousknul správně. Podotýkám, že délka se neměnila (vždy 125), vše procházelo poslední else větví.

Už si s tím absolutně nevím rady, ale byl bych rád, kdyby se mi podařilo s vaší pomocí dekodér zprovoznit.
SpatnaKlavesnice
Profil *
A kam vypisujes ta rozlustena data? Do konzole? Zkus si vypsat take vstup do te rozlustovaci funkce, jestli se nelisi.
TomasJ
Profil
SpatnaKlavesnice:
Právě i vstup se musí lišit, to je podle mě dáno těmi maskami. Ale udělám výpis a postnu. Nejlepší bude když sem hodím jednotlivé ASCII hodnoty příchozích dat.

------------------------------------------
Tak se nestačím divit:
Vstupni data po znacich v poli: 65533,65533,62,65533,119,39,112,65533,20,76,4,65
533,45,87,76,65533,1,70
Vstupni data originalni: ??>?w'p?¶L♦?-WL?☺F
Packet length: 125
N ck: Zpr va

Vstupni data po znacich v poli: 65533,65533,61,105,95,15,115,0,60,100,7,73,5,127
,79,8,41,110
Vstupni data originalni: ??=i_☼s <dI♣⌂)n
Packet length: 125
Nick: Zprava

Vstupni data po znacich v poli: 65533,65533,56,22,336,118,127,65533,65533,2,54,6
5533,65533,74,119,65533,65533
Vstupni data originalni: ??8▬Őv⌂??☻6??Jw??
Packet length: 125
G??t♫??<O??

Vstupni data po znacich v poli: 65533,65533,65533,30,66,65533,65533,119,33,65533
,65533,62,24,1001,127,52,65533
Vstupni data originalni: ???▲B??w!??>↑?⌂4?
Packet length: 125
 ic   Z??*?

Vstupni data po znacich v poli: 65533,65533,95,40,80,103,17,65,51,12,101,8,10,23
,45,73,38,6
Vstupni data originalni: ??_(Pg◄A3♀e
↨-I&♠
Packet length: 125
Nick: Zprava
Takže narážím nejspíš na problém, že data nejsou brána po bajtech. Jak se to v JS dá vyřešit?
SpatnaKlavesnice
Profil *
Osobne bych data ukladal do Bufferu, ktery je na tyto veci urceny.
TomasJ
Profil
SpatnaKlavesnice:
Díky moc, já je tam používal, ale neužíval jsem "encoding", nechával jsem prázdné buffer.toString().
Projel jsem seznam kódování a narazil jsem na "binary". Poslal jsem právě takto dekódovaný řetězec funkci a funguje to. Ukázka:
Vstupni data po znacich v poli: 129,140,64,177,45,150,14,216,78,253,122,145,119,
230,50,208,91,247
Vstupni data originalni: ??@+-?♫ONýz?wa2?[÷
Packet length: 12
Nick: Zprava
Vstupni data po znacich v poli: 129,140,65,86,115,62,15,63,16,85,123,118,41,78,5
1,55,5,95
Vstupni data originalni: ??AVs>☼?►U{v)N37♣_
Packet length: 12
Nick: Zprava
Vstupni data po znacich v poli: 129,140,75,126,140,176,5,23,239,219,113,94,214,1
92,57,31,250,209
Vstupni data originalni: ??K~?°♣↨iUq^ÖA9▼úN
Packet length: 12
Nick: Zprava
Vstupni data po znacich v poli: 129,140,49,100,252,42,127,13,159,65,11,68,166,90
,67,5,138,75
Vstupni data originalni: ??1dü*⌂
?A♂D|ZC♣?K
Packet length: 12
Nick: Zprava

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: