How can I send and receive WebSocket messages on the server side?

后端 未结 11 1896
轻奢々
轻奢々 2020-11-22 06:21
  • How can I send and receive messages on the server side using WebSocket, as per the protocol?

  • Why do I get seemingly random bytes at the server when

11条回答
  •  旧巷少年郎
    2020-11-22 06:41

    JavaScript implementation:

    function encodeWebSocket(bytesRaw){
        var bytesFormatted = new Array();
        bytesFormatted[0] = 129;
        if (bytesRaw.length <= 125) {
            bytesFormatted[1] = bytesRaw.length;
        } else if (bytesRaw.length >= 126 && bytesRaw.length <= 65535) {
            bytesFormatted[1] = 126;
            bytesFormatted[2] = ( bytesRaw.length >> 8 ) & 255;
            bytesFormatted[3] = ( bytesRaw.length      ) & 255;
        } else {
            bytesFormatted[1] = 127;
            bytesFormatted[2] = ( bytesRaw.length >> 56 ) & 255;
            bytesFormatted[3] = ( bytesRaw.length >> 48 ) & 255;
            bytesFormatted[4] = ( bytesRaw.length >> 40 ) & 255;
            bytesFormatted[5] = ( bytesRaw.length >> 32 ) & 255;
            bytesFormatted[6] = ( bytesRaw.length >> 24 ) & 255;
            bytesFormatted[7] = ( bytesRaw.length >> 16 ) & 255;
            bytesFormatted[8] = ( bytesRaw.length >>  8 ) & 255;
            bytesFormatted[9] = ( bytesRaw.length       ) & 255;
        }
        for (var i = 0; i < bytesRaw.length; i++){
            bytesFormatted.push(bytesRaw.charCodeAt(i));
        }
        return bytesFormatted;
    }
    
    function decodeWebSocket (data){
        var datalength = data[1] & 127;
        var indexFirstMask = 2;
        if (datalength == 126) {
            indexFirstMask = 4;
        } else if (datalength == 127) {
            indexFirstMask = 10;
        }
        var masks = data.slice(indexFirstMask,indexFirstMask + 4);
        var i = indexFirstMask + 4;
        var index = 0;
        var output = "";
        while (i < data.length) {
            output += String.fromCharCode(data[i++] ^ masks[index++ % 4]);
        }
        return output;
    }
    

提交回复
热议问题