为了账号安全,请及时绑定邮箱和手机立即绑定

DataOutputStream: dos.write() in loop, Receiver

DataOutputStream: dos.write() in loop, Receiver

噜噜哒 2022-11-30 16:52:39
我的 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();在平板电脑上,我通过以下代码片段接收数据:@Overridepublic 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();    }}正如我所说,当我只发送一个数据包时,连接工作正常。但是如果我想在循环内发送多个包裹,只有第一个包裹会到达目的地。谁能帮我?:)
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

调用close()aDataOutputStream会关闭其关联OutputStream的 ,关闭套接字OutputStream也会关闭套接字。这是记录在案的行为。


但是,那应该没问题,因为您的接收器代码无论如何只希望接收 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();

    }

}


查看完整回答
反对 回复 2022-11-30
  • 1 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信