【问题标题】:Decode "send" message from WebSocket with Java使用 Java 从 WebSocket 解码“发送”消息
【发布时间】:2012-02-10 20:27:36
【问题描述】:

我正在尝试编写自己的 WebSocket 服务器。

我知道这有一些框架,但我想学习,所以我自己做:)

我的 JavaScript 客户端当前响应 onOpen,所以我认为握手是有效的并且 连接已建立。

现在的问题:

我的 Java 服务器使用选择器线程读取通道。

如果我在客户端的 WebSocket 对象上执行*.send("test message"),我的服务器无法解码字节数组。

我没有找到关于使用的编码/解码技术的信息,所以我尝试了很多版本来解码。

例如:

new String(Base64.decodeBase64(buffer.array()))

Charset set = Charset.forName("UTF-8");
new String(Base64.decodeBase64(set.decode(buffer).toString()))

消息是完全从Channel读入ByteBuffer的,所以我觉得不是这个问题。

谁能帮帮我?


好的,这篇文章可以帮助我向客户发送数据。这很好用:)
但我不明白如何解码从客户端收到的数据:(

在客户我只发送一封信

socket.send("x");

服务器接收到 7 个字节???

ByteBuffer buffer = ByteBuffer.allocate(8192);
int read = client.getInputStream().read(buffer2.array());
System.out.println("read: " + read);

// read: 7

for (int i = 0; i < read; i++) {
  int j = buffer.get(i) & 0xff;
  System.out.println("i: " + i + " => " + j + "=>" + new BigInteger(j + "").toString(2));
}

//i: 0 => 129=>10000001
//i: 1 => 129=>10000001
//i: 2 => 195=>11000011
//i: 3 => 235=>11101011
//i: 4 => 4=>100
//i: 5 => 96=>1100000
//i: 6 => 187=>10111011

如果我这样做

secondByte AND 0111 1111

(i: 1) 的结果是“1”我认为这意味着只有一个字节数据。那为什么 read 是 7 ???

【问题讨论】:

标签: java javascript websocket


【解决方案1】:
private String decodeMessage(){
    try {
        byte[] data = new byte[1024];
        int size = in.read(data);
        if (size == -1) return null;
        byte[] decoded = new byte[size-6];
        byte[] key = new byte[]{ data[2], data[3], data[4], data[5] };
        for (int i = 0; i < size-6; i++) {
            decoded[i] = (byte) (data[i+6] ^ key[i & 0x3]);
        }
        return new String(decoded, "UTF-8");
    }catch (IOException ex){
        ex.printStackTrace();
    }
    return "ping";
}

这段代码可能很糟糕,但它对我有用

【讨论】:

    【解决方案2】:

    至于您的第二个问题 - 正如我在上面的链接中解释的那样,从客户端到服务器的数据始终是屏蔽。掩码占用 4 个字节。

    所以,实际数据的长度确实是 1。只有第二个字节的最后 7 位说明了长度 - 第一位没有,所以只需丢弃那个得到 000 0001 即 @ 987654322@.

    本例中字节分类如下:

    • 0, 1 是元字节
    • 3、4、5、6 是掩码
    • 7 是数据

    要获取数据,请计算data XOR masks[data_index MOD 4],即本例中的187 XOR 195,即120 - x 的字符代码。

    【讨论】:

    • @user1150445:如果它解决了您的问题,您能否接受一个答案?谢谢!
    猜你喜欢
    • 2014-08-15
    • 2018-05-10
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多