Linux 上的 Java 套接字错误(发送 0xFF,接收到 -3)

标签 java linux sockets

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

相关文章:

java - Java 对象的 null 属性是否使用内存?

java - Swing 中的 JFormattedTextField 或 JTextField 中仅允许整数和小数值

java - 如何在 PDF BOX 中创建按钮?

java - 覆盖maven中属性键的值

linux - 使用 Linux 命令从日志中提取数据

linux - centos上mongodb启动失败

c - linux内核中潜在的内存泄漏?

sockets - conn (net.Conn) 并不总是写在套接字上

即使在销毁套接字后,Node.js 内存使用率仍然很高

c - SOCK_RAW 套接字中缺少 ARP 数据包