首页 > 解决方案 > 我是否从来自套接字的 inputStream 获得格式错误的输入?

问题描述

我正在尝试连接到 WebSocket(当前使用 chrome 扩展)。我得到它的工作,我收到数据。当我尝试转换从输入流接收的整数时,我得到了完全其他的值。在下面的示例中,我输入了单词 test 作为输入。那么我做错了什么还是我解释输入错误?

代码:

@Override
public void run() {
    while (true) {
        try {
            if(client.getInputStream().read() != -1) {
                int i = client.getInputStream().read();
                System.out.println("Integer: " + i);

                byte b = (byte) i;
                System.out.println("Byte: " + b);

                char c = (char) b;
                System.out.println("Char: " + c);

                System.out.println("-=-=-=-=-=-=-=-=-=-=-=-");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出:

输出

标签: javasocketsserver

解决方案


java 流返回字节,但 read 返回一个 int,因此您可以获得 -1。因此,如果您的服务器正在发送一个 int,那么您需要读取该 int 的所有字节并创建它。

你有两种方法可以做到这一点。创建一个 byte[] 并将其用作缓冲区,或者如果您正在接收 32 位二进制补码整数,那么您可以使用 DataInputStream。

使用缓冲区的示例。

@Override
public void run() {
    while (true) {
        try {
            byte[] buffer = new byte[4];
            if(client.getInputStream().read(buffer) != -1) {
                int i = (
                          ( ( buffer[0] & 0xff ) << 24 ) | 
                          ( ( buffer[1] & 0xff ) << 16 ) |
                          ( (buffer[2] & 0xff ) <<  8) | 
                          (buffer[3] & 0xff)
                        );
                System.out.println("Integer: " + i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

或者您可以使用 DataInputStream。

    DataInputStream dis = new DataInputStream(client.getInputStream());
    try{
        int i = dis.readInt();
    } catch( EOFException e){
        //end of file. This is like getting -1.
    } catch( IOException e ){
        //do something for an error
    }

缓冲区版本使用与 java 的DataInput.readInt相同的转换,我已将其作为示例包含在内。还有一些额外的检查应该做。即使缓冲区有 4 个字节长,您也可以读取 1 到 4 个字节的任何内容。


推荐阅读