从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的主要内容,如果未能解决你的问题,请参考以下文章
Scanner和bufferreader读取控制台字符的区别
BufferReader buf_reader=new BuffReader(new InputStreamRead()System.in);请问这个Java是啥意思啊 3Q