在使用 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;
}
我还将这两个文件上传到我的服务器:
- 服务器.java http://www.mariusgundersen.net/junk/javaBug/test/Server.java
- 客户端.java http://www.mariusgundersen.net/junk/javaBug/test/Client.java
我的 Windows 机器运行 Windows 7,我的 Linux 机器运行 Debian
Edit:
当 b 是 int 时,它仍然表现得很奇怪。我发送 0xFF (255) 但收到 65533(不是 65535 或 255)。
问题不在您所显示的代码中。它在这里:
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
你正在处理二进制数据所以你应该使用原始流 - 不要把它变成Reader
,这是为了阅读人物.
您收到的是 65533,因为这是当某个值无法表示为真正的 Unicode 字符时使用的“Unicode 替换字符”的整数。当前代码的确切行为将取决于系统上的默认字符编码——这又不是您应该依赖的。
此外,您假设每个字节应转换为单个字符 - 本质上您假设 ISO-8859-1。我没有检查过规格,但我怀疑这就是你的意思should正在使用。
最后,你没有检查b
-1 - 用于指示客户端已关闭流。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)