我正在尝试制作一个简单的聊天服务器/客户端应用程序。我的服务器是用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消息。
它是否会在从套接字检查新行的同时永远陷入困境? 此外,如果有更优雅的方式,如果有人能指出我正确的方向,我真的很感激。
答案 0 :(得分:2)
它是否会在从套接字检查新行的过程中永远陷入困境?
不,但它可能永远陷入外部while (true)
循环,这完全没有意义。去掉它。目前,您将在流程结束时永远循环。
答案 1 :(得分:1)
它是否会在从套接字检查新行的过程中永远陷入困境?
是的,如果没有更多数据。但我怀疑这不是问题所在。我怀疑问题是这样的:
Looper.loop();
据我所知,您根本不需要使用Looper
。假设您真的在专用线程上,您希望处理哪些消息?没有任何呼叫Looper.quit()
,Looper.loop()
呼叫将永远阻止,我怀疑。
只是摆脱了两个Looper
来电,我怀疑你能看到所有的消息。
编辑:但是,您需要在UI线程上显示吐司 - 有关详细信息,请参阅this SO question,使用Activity.runOnUiThread
。我不确定在每条消息上显示祝酒是一个理想的用户界面,请注意......
你还想摆脱while (true)
- 你已经在内部循环上循环,所以没关系。