这是您在发送文字数据
时通常会执行的操作// 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);
}
}
}
答案 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,则跳出循环。