首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >DataOutputStream: dos.write()在循环中,接收方仅接收一个数据包

DataOutputStream: dos.write()在循环中,接收方仅接收一个数据包
EN

Stack Overflow用户
提问于 2019-05-17 04:28:53
回答 1查看 296关注 0票数 0

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

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

代码语言:javascript
复制
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();

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

代码语言:javascript
复制
@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();
    }
}

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

有人能帮我吗?:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 07:22:51

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

但是,这应该是可以的,因为您的接收器代码无论如何都只能接收一个单独的字符串。每个TCP连接只能调用dis.readUTF()一次。

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

代码语言:javascript
复制
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();
代码语言:javascript
复制
@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();
    }
}

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

代码语言:javascript
复制
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();
代码语言:javascript
复制
@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();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56176160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档