Java - 从datainputstream读取套接字而不会卡在其中

时间:2015-01-25 12:29:10

标签: java sockets datainputstream

我一直在尝试从另一种语言到Java进行通信,但是当我尝试在while循环中从DataInputStream读取数据时......

static String getData(DataInputStream stream){

    int charbyte;
    StringBuilder strbuilder = new StringBuilder();
    try {
        while ((charbyte = stream.read()) != -1){
            strbuilder.append(Character.toChars(charbyte));
        }
        stream.close();

        return new String(strbuilder);

    } catch (Exception e) {
        return null;
    }
}

问题是stream.read()没有返回-1,因为它只是在等待发送新数据。我怎样才能获得刚刚发送的数据?

1 个答案:

答案 0 :(得分:2)

该方法永远不会返回,因为while循环永远不会结束,这是由连接或DataInputStream保持打开引起的。

要通过网络连接发送可变数量的字节,其中读取器读取字符流,您有三个选项:

  1. 发送要遵循的字节数,作为网络顺序中的int,后跟多个字节。
  2. 如果字节是可打印字符,请发送空字节以指示结束。
  3. 发送字节后关闭流。
  4. 对于#1,将循环更改为

    try {
        int count = stream.readInt();
        for( int i = 0; i < count; ++i ){
            strbuilder.append(Character.toChars(stream.read()));
        }
        return strbuilder.toString();
    }
    

    对于#2,请使用

    try {
        while ((charbyte = stream.read()) != 0){
            strbuilder.append(Character.toChars(charbyte));
        }
        return strbuilder.toString();
    }
    

    您现在拥有的代码是#3。