我正在尝试重新发明轮子并创建自己的 websocket 服务器。它在 Google Chrome 和 Firefox 上都可以正常连接,并且可以正确接收和回显最长 127 个字符的文本帧。然而,除此之外,谷歌给了我以下错误:
WebSocket 连接到 'ws://localhost:9999/' 失败:必须使用最小字节数来编码长度
Firefox 有时会接收/解释前几个字符,然后失败代码:1006。
服务器显示正在完整接收消息并尝试完整广播它而没有运行时错误或 . 如我的 System.out.println() 所示,它也适用于 16 位长度的创建器。我来自服务器的 java 控制台读取:
websocket server started client connected message received 1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij12345678 broadcasting: 1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij1234567890abcdefghij12345678 2nd data
我目前正在编写一个帧测试器来测试我通过广播发送的帧,但希望社区能够为我节省一些腿部工作。真正奇怪的是 126 和 127 有效载荷长度工作并反映使用 2 个字节作为长度。
public void broadcast(String mess) throws IOException {
System.out.println("broadcasting: "+mess);
byte[] rawData = mess.getBytes();
int frameCount = 0;
byte[] frame = new byte[10];
frame[0] = (byte) 129;
if (rawData.length <= 125) {
frame[1] = (byte) rawData.length;
frameCount = 2;
} else if (rawData.length >= 126 && rawData.length <= 65535) {
System.out.println("2nd data");
frame[1] = (byte) 126;
byte len = (byte) rawData.length;
frame[2] = (byte) ((len >> 8) & (byte) 255);
frame[3] = (byte) (len & (byte) 255);
frameCount = 4;
} else {
System.out.println("3rd data");
frame[1] = (byte) 127;
byte len = (byte) rawData.length;
frame[2] = (byte) ((len >> 56) & (byte) 255);
frame[3] = (byte) ((len >> 48) & (byte) 255);
frame[4] = (byte) ((len >> 40) & (byte) 255);
frame[5] = (byte) ((len >> 32) & (byte) 255);
frame[6] = (byte) ((len >> 24) & (byte) 255);
frame[7] = (byte) ((len >> 16) & (byte) 255);
frame[8] = (byte) ((len >> 8) & (byte) 255);
frame[9] = (byte) (len & (byte) 255);
frameCount = 10;
}
int bLength = frameCount + rawData.length;
byte[] reply = new byte[bLength];
int bLim = 0;
for (int i = 0; i < frameCount; i++) {
reply[bLim] = frame[i];
bLim++;
}
for (int i = 0; i < rawData.length; i++) {
reply[bLim] = rawData[i];
bLim++;
}
for (OutputStream writer : writers) {
writer.write(reply);
writer.flush();
}
}
感谢社区的任何帮助。