gpt4 book ai didi

java - DataOutputStream:循环中的dos.write(),Receiver只接收到一个数据包

转载 作者:行者123 更新时间:2023-12-02 09:53:05 25 4
gpt4 key购买 nike

我的 TCP 连接有问题。我通过 TCP 套接字连接通过智能手机将数据(一个简单的字符串)发送到平板电脑。连接工作正常并且数据按预期传输。但是,当我执行循环并在每次迭代中触发 dos.write() 时,只有一个包到达平板电脑数据接收器。我做错了什么?

这是我的连接的发送部分。它遍历列表并将每个数据写入 DataOutputStream

for(int i = 0; i <= logList.length - 1; ++i){
String backupPayload = invertLogStringToJson(logList[i]);

dos = new DataOutputStream(s.getOutputStream());

dos.writeUTF(backupPayload);
dos.flush();
dos.close();

在平板电脑上,我通过以下代码 fragment 接收数据:

@Override
public void run() {
try {

while(true){
mySocket = ss.accept();
dis = new DataInputStream(mySocket.getInputStream());
message = dis.readUTF();

handler.post(() -> {
bufferIntentSendCode.putExtra("data", message);
ctx.sendBroadcast(bufferIntentSendCode);
});
}
} catch (IOException e) {
e.printStackTrace();
}
}

正如我所说,当我仅发送一个数据包时,连接工作正常。但如果我想在循环内发送多个包裹,则只有第一个包裹会到达目的地。

有人可以帮助我吗? :)

最佳答案

DataOutputStream 上调用 close() 将关闭其关联的 OutputStream,而关闭套接字的 OutputStream 将关闭该套接字的 OutputStream。 socket 。这是有记录的行为。

但是,这应该没问题,因为您的接收器代码无论如何都只期望接收 1 个字符串。每个 TCP 连接仅调用一次 dis.readUTF()

如果您想在单个连接中发送多个字符串,请不要在发送端调用 dos.close() (至少在所有字符串都已发送之前),并且不要在接收端循环调用 dis.readUTF() ,直到接收到所有字符串。

dos = new DataOutputStream(s.getOutputStream());

for(int i = 0; i < logList.length; ++i){
String backupPayload = invertLogStringToJson(logList[i]);
dos.writeUTF(backupPayload);
}
dos.flush();

dos.close();
@Override
public void run() {
try {
while (true) {
mySocket = ss.accept();
dis = new DataInputStream(mySocket.getInputStream());

try {
while (true) {
message = dis.readUTF();
handler.post(() -> {
bufferIntentSendCode.putExtra("data", message);
ctx.sendBroadcast(bufferIntentSendCode);
});
}
} catch (IOException e) {
}

dis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

或者,在发送实际字符串之前发送列表长度,然后在读取字符串之前读取长度:

dos = new DataOutputStream(s.getOutputStream());

// maybe other things first...

dos.writeInt(logList.length);
for(int i = 0; i < logList.length; ++i){
String backupPayload = invertLogStringToJson(logList[i]);
dos.writeUTF(backupPayload);
}
dos.flush();

// maybe other things next...

dos.close();
@Override
public void run() {
try {
while (true) {
mySocket = ss.accept();
dis = new DataInputStream(mySocket.getInputStream());

try {
// maybe other things first...

int length = dis.readInt();
for (int i = 0; i < length; ++i) {
message = dis.readUTF();
handler.post(() -> {
bufferIntentSendCode.putExtra("data", message);
ctx.sendBroadcast(bufferIntentSendCode);
});
}

// maybe other things next...

} catch (IOException e) {
}

dis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}

关于java - DataOutputStream:循环中的dos.write(),Receiver只接收到一个数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56176160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com