从socket bufferreader永远读取android

时间:2014-12-18 09:07:39

标签: java android sockets asyncsocket

我正在尝试制作一个简单的聊天服务器/客户端应用程序。我的服务器是用python制作的,使用twisted。一切都很好用,用telnet进行测试。

服务器基本上会向其所有客户发送它收到的每条消息。我需要一种永远从套接字读取的方法,以便我可以获取所有消息。我不认为它是最好的方法,但我试图使用一个永久读取的线程(现在)。客户端连接到服务器后,它将启动一个线程,它将永远检查更新。

以下是我的 CheckUpdates类,它实现了Runnable:

class CheckUpdates implements  Runnable{
    @Override
    public void run() {
       Log.d("ME", "CHECKING FOR UPDATES");
        while(true)
        {
            // reader.lines().forEach(System.out.println);
            String line;
            Log.d("ME","IN WHILE");
            try {
                while ((line = reader.readLine()) != null) {
                    Log.d("ME", "READING LINE");
                    Looper.prepare();
                    Toast.makeText(MainActivity.this, line, Toast.LENGTH_SHORT).show();
                    Looper.loop();
                }
            } catch (IOException e) {
                Log.d("ME", "EXCEPTION IN WHILE: " + e.getMessage().toString());
            }
            Log.d("ME", "END OF WHILE CHECK UPDATES");
        }
    }
}

我正在连接到服务器后立即启动线程。 基本上,我正在收到第一条消息(第一个吐司),之后就没有其他内容了,甚至还没有 END OF WHILE CHECK UPDATE logcat消息。

它是否会在从套接字检查新行的同时永远陷入困境? 此外,如果有更优雅的方式,如果有人能指出我正确的方向,我真的很感激。

2 个答案:

答案 0 :(得分:2)

  

它是否会在从套接字检查新行的过程中永远陷入困境?

不,但它可能永远陷入外部while (true)循环,这完全没有意义。去掉它。目前,您将在流程结束时永远循环。

答案 1 :(得分:1)

  

它是否会在从套接字检查新行的过程中永远陷入困境?

是的,如果没有更多数据。但我怀疑这不是问题所在。我怀疑问题是这样的:

Looper.loop();

据我所知,您根本不需要使用Looper。假设您真的在专用线程上,您希望处理哪些消息?没有任何呼叫Looper.quit()Looper.loop()呼叫将永远阻止,我怀疑。

只是摆脱了两个Looper来电,我怀疑你能看到所有的消息。

编辑:但是,您需要在UI线程上显示吐司 - 有关详细信息,请参阅this SO question,使用Activity.runOnUiThread。我不确定在每条消息上显示祝酒是一个理想的用户界面,请注意......

你还想摆脱while (true) - 你已经在内部循环上循环,所以没关系。