我是否从来自套接字的 inputStream 获得格式错误的输入?

Do i get malformed input from inputStream coming off a socket?

我正在尝试连接到 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();
        }
    }
}

输出:

output

一个java流returns字节,但是读returns一个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 个字节的任何内容。