DataOutputStream: dos.write() in loop, Receiver

我的 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();

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


@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();

    }

}

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


谁能帮我?:)


噜噜哒
浏览 101回答 1
1回答

回首忆惘然

调用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){&nbsp; &nbsp; String backupPayload = invertLogStringToJson(logList[i]);&nbsp; &nbsp; dos.writeUTF(backupPayload);}dos.flush();dos.close();@Overridepublic void run() {&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; while (true) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mySocket = ss.accept();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dis = new DataInputStream(mySocket.getInputStream());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (true) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; message = dis.readUTF();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handler.post(() -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bufferIntentSendCode.putExtra("data", message);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctx.sendBroadcast(bufferIntentSendCode);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dis.close();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; }}或者,在发送实际字符串之前发送列表长度,然后在读取字符串之前读取长度:dos = new DataOutputStream(s.getOutputStream());// maybe other things first...dos.writeInt(logList.length);for(int i = 0; i < logList.length; ++i){&nbsp; &nbsp; String backupPayload = invertLogStringToJson(logList[i]);&nbsp; &nbsp; dos.writeUTF(backupPayload);}dos.flush();// maybe other things next...dos.close();@Overridepublic void run() {&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; while (true) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mySocket = ss.accept();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dis = new DataInputStream(mySocket.getInputStream());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // maybe other things first...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int length = dis.readInt();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < length; ++i) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; message = dis.readUTF();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handler.post(() -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bufferIntentSendCode.putExtra("data", message);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctx.sendBroadcast(bufferIntentSendCode);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // maybe other things next...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dis.close();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java