Java 跑 tcp 的时候遇到一个很诡异的问题,不加一句 sout 不能成功给服务器发消息

2018-11-13 21:05:36 +08:00
 Event

客户端有一个消息队列 发消息都是 msg.add(byte[]) 然后每次发送前输出 msg.size() 发送完就 remove 但是每次 msg.size 都在变大

用调试看,也确实跑到了 remove 的位置

然后我就发现了很诡异的情况 1.调试状态下服务端能收到消息,客户端的 size 也有在减小,消息有发出去 2.正常状态运行,似乎客户端的消息 write 不到 OutputStream 3.在每次发送消息前加一句 sout,消息就可以正常发出去和被收到,但是用 Thread.sleep 不行

注:收消息发消息我都是专门建了一个 Thread 跑的。 猜测是不是出现了线程安全问题呢? 头疼 怎么调试都调试不出来

贴出发送消息线程的代码:

package com.lmyun.socket.thread;

import com.lmyun.socket.SocketUtils;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.LinkedList;
import java.util.List;

public class SocketSendThread extends Thread {
    private Socket socket;
    private List<byte[]> msg;

    public SocketSendThread(Socket socket) throws IOException {
        this.socket = socket;
        this.msg = new LinkedList<>();
    }

    @Override
    public void run() {
        while (true) {
            //System.out.println(this.msg.size());
            if (msg.size() == 0) {
                continue;
            }
            try {
                this.sendMsg(msg.get(0));
            } catch (IOException e) {
                e.printStackTrace();
            }
            msg.remove(0);
        }
    }

    public void addMsg(byte[] msg) {
        this.msg.add(msg);
        System.out.println(this.msg.size());
    }

    public void sendMsg(byte[] b) throws IOException {
        OutputStream os = this.socket.getOutputStream();
        os.write(SocketUtils.IntToByte(b.length));
        os.write(b);
        os.flush();
    }
}

太诡异!!!!!!!

1006 次点击
所在节点    问与答
5 条回复
mind3x
2018-11-13 21:11:54 +08:00
施主你可知道 LinkedList 不是线程安全的?
好歹也用个 ArrayBlockingQueue 或者 LinkedBlockingQueue 吧
Event
2018-11-13 21:15:22 +08:00
@mind3x ok 我去了解下。。
Event
2018-11-13 21:16:32 +08:00
@mind3x 但是发送这个问题应该和这个没关系吧。。
misaka19000
2018-11-13 21:21:42 +08:00
remove 方法不改变 size 吧好像
Event
2018-11-13 21:21:48 +08:00
@mind3x 谢谢。修改为 queue 的确解决了问题


可是就算 linkedlist 是线程不安全 可为何取出数据后无法发送呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/507545

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX