BufferedReader丢弃行

时间:2013-06-17 11:00:22

标签: java android sockets java-io

我在与我的主应用程序不同的一个帖子中写这样的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手机接收。关于如何发生这种情况以及如何解决这个问题的任何提示?

1 个答案:

答案 0 :(得分:0)

事实证明,我们的代码存在许多问题。事实证明,有两个线程写入缓冲区,因为Android应用程序连接两次。只有一个人正在写入正确的套接字。队列上没有同步使得哪个线程正在消耗不可预测的事件,因此在ja_mesa提示编号调试日志之后很难注意到。

事实证明,在inputthread死后我们必须终止输出编写器线程。