在写入字节数组时,在循环中读取Socket InputStream

时间:2014-06-09 16:53:56

标签: java sockets

这是您在发送文字数据

时通常会执行的操作
// Receiver code
while (mRun && (response = in.readLine()) != null && socket.isConnected()) {
    // Do stuff                 
}

// Sender code
printWriter.println(mMessage);
printWriter.flush();

但在使用DataOutputStream#write(byte[])发送byte[]时,如何编写while循环来接收已发送的数据。

我发现的只是这个,但它并没有循环,所以我猜这只会在第一个发送的消息上运行:

int length = in.readInt();
byte[] data = new byte[length];
in.readFully(data);

我怎样才能做到这一点?

PS:是的,我是套接字编程的新手。

编辑:我每隔3到5秒发送一个字节数组。这是我到目前为止所做的。

// In the client side, in order to send byte[]. This is executed each 3 seconds.
if(out != null) {
    try {
        out.writeInt(encrypted.length);
        out.write(encrypted);
        out.writeInt(0);
        out.flush();
        return true;

    } catch (IOException e) {
        e.printStackTrace();

        return false;
    }
}


 // In the serverside, in order to receive byte[] sent from client (also executed 3 to 5 seconds due to bytes being sent at said rate.  "client" being the Socket instance.
while(true && client.isConnected()) {

    byte[] data = null;

    while(true) {
        int length = in.readInt();
        if(length == 0)
            break;

        data = new byte[length];
        in.readFully(data);
    }

    if(data != null) {
        String response = new String(data);

        if(listener != null) {
            listener.onMessageReceived(response);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

假设您正在尝试处理消息流,那么您所缺少的声音就是指定(在流中)消息的大小(或者消息的结束位置)。

我建议你在每条消息前写一个前缀,指定长度:

output.writeInt(data.length);
output.write(data);

然后阅读:

while (true)
{
    int length = input.readInt();
    byte[] buffer = new byte[length];
    input.readFully(buffer, 0, length);
    // Process buffer
}

还需要找出一种检测输入结束的方法。就我所知,DataInputStream并没有一种干净的方法来检测。有各种选项 - 最简单的可能是写出长度为0的消息,如果读取长度为0,则跳出循环。