JAVA 上的 TCP 套接字 - 任何 >= 128 的字节都被接收为 65533

lyc*_*001 3 java sockets android tcp

我正在 Android 上实现一个服务器,我正在使用:

while (!Thread.currentThread().isInterrupted()) {
    try {
        int r;
        String response = "";
        while ((r = input.read()) > 0) {
        ...
        }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题。如果客户端向我发送一个值为 0 的字节,则服务器不会收到它。

第二个问题是,如果字节值是 128 或更多,我不断收到 65533 的值或 11111101 的二进制值。

任何人都知道如何解决这些问题。我是 JAVA 网络的初学者。

Car*_*Ros 5

我遇到了同样的问题,我在这个问题中找到了答案:

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

您收到 65533 是因为当值不能表示为真正的 Unicode 字符时,这是用于“Unicode 替换字符”的整数。您当前代码的确切行为将取决于您系统上的默认字符编码——这同样不是您应该依赖的。

我失败的代码就像(简化):

InputStream is = socket.getInputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(is));

int data = input.read();
if(data >=0){
    System.out.println("Obtained: "+data);
}
Run Code Online (Sandbox Code Playgroud)

像您一样,它正在打印:Obtained: 65533当另一侧发送大于 127 的数字时。

要解决这个问题,只需调用该InputStream.read()方法而不是创建 any reader

InputStream is = socket.getInputStream();

int data = is.read();
if(data >=0){
    System.out.println("Obtained: "+data);
}
Run Code Online (Sandbox Code Playgroud)

注意:这个问题可能会被标记为与先前引用的问题重复。