客户端有一个消息队列 发消息都是 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();
}
}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.