我在与我的主应用程序不同的一个帖子中写这样的ServerSocket
:
BlockingQueue<String> queue = new Queue<>();
// THREAD
ServerSocket server = new ServerSocket(2222);
Socket socket = server.accept();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8"));
while (true) {
String line = queue.take();
if (line != null) {
try {
logger.debug("Sending command " + line);
writer.write(line + "\n");
writer.flush();
} catch (IOException e) {
logger.error("IO error", e);
e.printStackTrace();
}
}
}
从外部填充queue
的位置。
发送的东西工作正常,我可以通过端口2222上的telnet和读取调试记录器输出来验证这一点。
在android上我通过以下代码在端口2222上阅读:
Socket s = new Socket("host",2222);
BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream(),"UTF-8"));
while((line = reader.readLine()) != null) {
Log.d("PAINT","RECEIVED::" + line);
// create Message, Bundle, send Message to handler.
}
然而,我发送的每一条消息中的一条(如十分之一)都没有被Android手机接收。关于如何发生这种情况以及如何解决这个问题的任何提示?
答案 0 :(得分:0)
事实证明,我们的代码存在许多问题。事实证明,有两个线程写入缓冲区,因为Android应用程序连接两次。只有一个人正在写入正确的套接字。队列上没有同步使得哪个线程正在消耗不可预测的事件,因此在ja_mesa提示编号调试日志之后很难注意到。
事实证明,在inputthread死后我们必须终止输出编写器线程。