从socket bufferreader永远读取android

Posted

技术标签:

【中文标题】从socket bufferreader永远读取android【英文标题】:Read from socket bufferreader forever android 【发布时间】:2014-12-18 09:07:38 【问题描述】:

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

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

这是我实现 Runnable 的 CheckUpdates 类

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 UPDATES logcat 消息。

在检查来自 socket 的新行时,它会永远卡住吗? 另外,如果有更优雅的方式来做到这一点,如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

【参考方案1】:

在从套接字检查新行的过程中会永远卡住吗?

不,但它可能会永远卡在外部 while (true) 循环中,这完全没有意义。去掉它。目前,您在流的末尾永远循环播放。

【讨论】:

我想永远循环,因为我想获取所有消息。我想如果我抽出时间,我只会得到第一个或......? @user1812076:不,你已经有一个while 循环在里面,所以你循环所有的行。你真的不需要那个while (true)。 (我错过了......) 你完全正确。如果我没有显示任何 Toast,而只是使用 logcat 检查,一切正常。我收到了每条消息,但是如何用每条消息更新 UI 线程(或显示祝酒词)?基本上这是最终目标。 @user1812076 不,你不要“想要永远循环”。您想循环直到流结束,这就是您的内部 while 循环所做的。您的 outer while 循环只是一个错误。流结束后不能有任何消息。你的第二条评论的意思完全让我无法理解。 我不是 android 专家,但您似乎已经在这样做了。无论如何,这是一个新问题。【参考方案2】:

在从套接字检查新行的过程中会永远卡住吗?

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

Looper.loop();

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

只要去掉两个Looper 电话,我怀疑你就能看到所有的消息。

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

您还想摆脱 while (true) - 您已经在 inner 循环上循环了,这很好。

【讨论】:

如果我取出looper,它会抛出异常,因为我没有显示来自UI线程的toast。但是,是的,看起来 Looper.loop 是问题所在。如何在没有 Looper 的情况下从另一个线程更新主线程? @user1812076:啊,错过了祝酒词。对,所以您应该在 UI 线程上就这样做,使用Activity.runOnUiThread。见***.com/questions/3134683/android-toast-in-a-thread

以上是关于从socket bufferreader永远读取android的主要内容,如果未能解决你的问题,请参考以下文章

java中bufferreader的使用方法有哪些?

Scanner和bufferreader读取控制台字符的区别

node 怎么样将一个buffer写入文件

如何优雅地关闭资源

JDK源码:BufferedReader

BufferReader buf_reader=new BuffReader(new InputStreamRead()System.in);请问这个Java是啥意思啊 3Q