-1

我正在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.

}

然而,我发送的每几条消息中就有一条(如十分之一)没有被安卓手机接收。关于如何发生这种情况以及如何解决这个问题的任何提示?

4

1 回答 1

0

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

事实证明,我们不得不在 inputthread 死后终止 outputwriter 线程。

于 2013-06-17T11:47:08.910 回答