有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我会从来自socket的inputStream获得格式错误的输入吗?

我正在尝试连接WebSocket(目前正在使用chrome扩展)。我收到数据后就开始工作了。当我试图转换从输入流接收的整数时,我得到的是完全其他的值。在下面的例子中,我输入了单词测试。那么,我是做错了什么,还是我把输入理解错了

代码:

@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


共 (1) 个答案

  1. # 1 楼答案

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

    你有两种方法。创建一个字节[]并将其用作缓冲区,或者如果您正在接收32位2补整数,则可以使用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字节的任何内容