在使用 Java 开发 WebSocket 服务器时,我遇到了这个奇怪的错误。我已经将它缩减为两个小的 java 文件,一个是服务器,另一个是客户端。客户端只需发送 0x00
、字符串 Hello
,然后发送 0xFF
(根据 WebSocket 规范)。
在我的 windows 机器上,服务器打印以下内容:
Listening
byte: 0
72 101 108 108 111 recieved: 'Hello'
在我的 unix 机器上,相同的代码打印出以下内容:
Listening
byte: 0
72 101 108 108 111 -3
它接收的不是 0xFF,而是 -3,从不跳出循环,也从不打印它接收到的内容。
代码的重要部分如下所示:
byte b = (byte)in.read();
System.out.println("byte: "+b);
StringBuilder input = new StringBuilder();
b = (byte)in.read();
while((b & 0xFF) != 0xFF){
input.append((char)b);
System.out.print(b+" ");
b = (byte)in.read();
}
inputLine = input.toString();
System.out.println("recieved: '" + inputLine+"'");
if(inputLine.equals("bye")){
break;
}
我也已将这两个文件上传到我的服务器:
我的 Windows 机器运行的是 Windows 7,我的 Linux 机器运行的是 Debian
编辑:
当 b 是一个 int 时,它仍然表现得很奇怪。我发送 0xFF (255) 但收到 65533(不是 65535 或 255)。
最佳答案
问题不在您显示的代码中。它在这里:
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
您正在处理二进制数据,因此您应该使用原始流 - 不要将其转换为用于阅读的Reader
字符。
您收到 65533 是因为当值不能表示为真正的 Unicode 字符时,这是用于“Unicode 替换字符”的整数。您当前代码的确切行为将取决于您系统上的默认字符编码 - 这同样不是您应该依赖的东西。
此外,您假设每个字节都应转换为单个字符——本质上您假设的是 ISO-8859-1。我没有检查规范,但我怀疑那是你应该使用的。
最后,您没有检查 b
是否为 -1 - 它用于指示客户端已关闭流。
关于Linux 上的 Java 套接字错误(发送 0xFF,接收到 -3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2818876/