Java - WebSocket发送十六进制0x 0A

plicqrtu  于 2023-03-02  发布在  Java
关注(0)|答案(1)|浏览(222)

我一直致力于Android(Java)应用程序,创建一个WebSocket服务器,一切顺利,连接被接受。
向客户端发送消息时出现问题(浏览器WebSocket)

OutputStream writer = client.getOutputStream();
    // FIN OPCODE 1000 0001
    writer.write(0x81);

    // message length
    writer.write(0x5);

    writer.write('H');
    writer.write('e');
    writer.write('l');
    writer.write('l');
    writer.write('o');
    writer.flush();

出现错误:failed: Invalid frame header
我安装webshark看到的问题:

在右侧,您将看到数据

-0x 0A-〉问题所在。

  • 0x 81-〉财务和操作码(10000001)
  • 0x 05-〉消息长度
  • 0x 48 0x 65 0x 6c 0x 6c-〉地狱

======更多代码======
我如何阅读客户端请求(头)?

private String readClientInputStream() {
    String str = null;
    try {
        InputStream in = client.getInputStream();
        byte[] buffer = new byte[1024];
        int countBytesRead = in.read(buffer);
        if (countBytesRead > 0) {
            str = new String(buffer, 0, countBytesRead);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return str;
}

使用str获取Sec-WebSocket-Key并发送响应(握手):

public void sendWebSocketHandShake(String str) {
    String[] result = str.split("Sec-WebSocket-Key: ", -1)[1].split("\\n");
    String key = makeKeyAccept(result[0]); // METHOD CODE BELLOW
    StringBuilder handshake_str = new StringBuilder();
    handshake_str.append("HTTP/1.1 101 Switching Protocols\n");
    handshake_str.append("Upgrade: websocket\n");
    handshake_str.append("Connection: Upgrade\n");
    handshake_str.append("Sec-WebSocket-Accept: ").append(key).append("\n");
    handshake_str.append("\n");
    try {
        OutputStream out = client.getOutputStream();
        byte[] b = handshake_str.toString().getBytes(StandardCharsets.UTF_8);
        out.write(b, 0, b.length);
        out.flush();

    } catch (IOException e) {
        e.printStackTrace();
    }

}

如何制作Sec-WebSocket-Accept密钥?

public String makeKeyAccept(String key) {
        String _acceptKey = key.trim() + WEBSOCKET_KEY_MAGIC;
        MessageDigest digest = null;
        String base64 = null;
        try {
            digest = MessageDigest.getInstance("SHA-1");
            digest.update(_acceptKey.getBytes(StandardCharsets.UTF_8));
            byte[] encoded = android.util.Base64.encode(digest.digest(), 0, digest.getDigestLength(), android.util.Base64.DEFAULT);
            base64 = new String(encoded, 0, encoded.length, StandardCharsets.UTF_8);
        } catch (Exception ignore){}

        return base64;
    }
hm2xizp9

hm2xizp91#

谢谢你@马克·罗特维尔

正如他告诉我的,问题可能是从握手和遗留下来的字节。
我在创建密钥base64后使用trim()修复了它

相关问题