gpt4 book ai didi

java - Websocket:发送超过 65535 字节的消息失败

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:48:42 25 4
gpt4 key购买 nike

我从头开始用 java 开发了一个 websocket 服务器。 JavaScript 客户端在浏览器中运行:

function connectToServer() {
connection = new WebSocket("ws://" + document.domain + ":8351");
connection.onopen = function () {
};

connection.onmessage = function (e) {
handleServerResponse(e.data);
};
}

一切正常,直到消息 (json) 达到 65535 字节。然后关闭套接字(我还没有弄清楚,如果客户端或服务器关闭连接。

在浏览器控制台(尝试了几个浏览器)我看到:页面加载时与 ws://localhost:8351/的连接中断。

在服务器端,我看到:java.net.SocketException: Connection reset 在 java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)

因此,如果问题出在握手上,或者我在服务器中错误地构建了框架,并且客户端关闭了连接,或者我写入的字节流不正确,并且 java io 关闭了套接字。

我的代码(服务器):

1)握手(服务器响应)

  String _01 = "HTTP/1.1 101 Switching Protocols\r\n";
String _02 = "Upgrade: websocket\r\n";
String _03 = "Connection: Upgrade\r\n";
String _04 = "Sec-WebSocket-Accept: " + responseKey + "\r\n";
String _05 = "Content-Encoding: identity\r\n";

2) 构建框架(是否应该将大消息分解为不同的框架?)

public static byte[] buildFrame(String message)
{
int length = message.length();
int rawDataIndex = -1;
if (length <= 125)
rawDataIndex = 2;
else if (length >= 126 && length <= 65535)
rawDataIndex = 4;
else
rawDataIndex = 10;
byte[] frame = new byte[length + rawDataIndex];
frame[0] = (byte)129;
if (rawDataIndex == 2)
frame[1] = (byte)length;
else if (rawDataIndex == 4)
{
frame[1] = (byte)126;
frame[2] = (byte)(( length >> 8 ) & (byte)255);
frame[3] = (byte)(( length ) & (byte)255);
}
else
{
frame[1] = (byte)127;
frame[2] = (byte)(( length >> 56 ) & (byte)255);
frame[3] = (byte)(( length >> 48 ) & (byte)255);
frame[4] = (byte)(( length >> 40 ) & (byte)255);
frame[5] = (byte)(( length >> 32 ) & (byte)255);
frame[6] = (byte)(( length >> 24 ) & (byte)255);
frame[7] = (byte)(( length >> 16 ) & (byte)255);
frame[8] = (byte)(( length >> 8 ) & (byte)255);
frame[9] = (byte)(( length ) & (byte)255);

}
for (int i = 0; i < length; i++)
frame[rawDataIndex + i] = (byte)message.charAt(i);
return frame;
}

3) 将字节写入套接字(我试过 socket.setSendBufferSize 和 BufferedOutputStream,没有任何帮助)

socket.getOutputStream().write(byteMessage);
socket.getOutputStream().flush();

有人遇到过同样的问题吗?欢迎任何帮助!

最佳答案

我知道现在回答有点晚了......但无论如何,我遇到了同样的问题和这段代码:

    frame[1] = (byte)127;
frame[2] = (byte)(( length >> 56 ) & (byte)255);
frame[3] = (byte)(( length >> 48 ) & (byte)255);
frame[4] = (byte)(( length >> 40 ) & (byte)255);
frame[5] = (byte)(( length >> 32 ) & (byte)255);
frame[6] = (byte)(( length >> 24 ) & (byte)255);
frame[7] = (byte)(( length >> 16 ) & (byte)255);
frame[8] = (byte)(( length >> 8 ) & (byte)255);
frame[9] = (byte)(( length ) & (byte)255);

有效。您的问题是您的变量“length”是一个 32 位的 int。并且您正在对 8 个字节执行位移,因此您可以从内存中获取随机数据。如果您将变量“长度”定义为 64 位长,那么它就可以工作。

long length = (long)message.length();

非常适合我。

希望能帮到想了解的人。

关于java - Websocket:发送超过 65535 字节的消息失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17693956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com