当前位置:  开发笔记 > 编程语言 > 正文

linux上的Java套接字bug(发送0xFF,收到-3)

如何解决《linux上的Java套接字bug(发送0xFF,收到-3)》经验,为你挑选了1个好方法。

在用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

获得-3而不是接收0xFF,从不打破循环并且永远不会打印它收到的内容.

代码的重要部分如下所示:

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;
}

我还将这两个文件上传到我的服务器:

Server.java

Client.java

我的Windows机器正在运行Windows 7,而我的Linux机器正在运行Debian

编辑:
当b是一个int时,它仍然很奇怪.我发送0xFF(255)但接收65533(不是65535或255).



1> Jon Skeet..:

问题不在于您显示的代码中.它在这里:

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

您正在处理二进制数据,因此您应该使用原始流 - 不要将其转换为a Reader,这是用于读取字符.

您正在接收65533,因为这是用于"Unicode替换字符"的整数,当值无法表示为真正的Unicode字符时使用.当前代码的确切行为将取决于系统上的默认字符编码 - 这也不是您应该依赖的内容.

此外,您假设每个字节应转换为单个字符 - 基本上您假设ISO-8859-1.我没有检查规格,但我怀疑那是你应该使用的.

最后,您没有检查是否为b-1 - 这用于表示客户端已关闭流.

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有