java - 永远从 socket bufferreader 读取 android

标签 java android sockets asyncsocket

我正在尝试制作一个简单的聊天服务器/客户端应用程序。我的服务器是用 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");
        }
    }
}

我在连接到服务器后立即启动线程。 基本上,我收到了第一条消息(第一个 toast ),紧接着,没有其他消息进来,甚至 END OF WHILE CHECK UPDATES logcat 消息也没有。

它是否会永远卡在 while 从 socket 检查换行的过程中? 此外,如果有更优雅的方式来做到这一点,如果有人能指出我正确的方向,我将不胜感激。

最佳答案

Could it get stuck forever in the while that checks for a new line from socket ?

不,但它可能永远卡在外部 while (true) 循环中,这是完全没有意义的。去掉它。此刻你在流的尽头永远循环。

关于java - 永远从 socket bufferreader 读取 android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27542808/

相关文章:

android - sqlite 更新在 android lollipop 中失败但在 kitkat 上有效?

java - 改变资源的颜色

.net - SocketAsyncEventArgs "pooled byte[]"样式是否有助于减少内存需求?

vb.net - Windows Server 2003上的SocketException

ruby 套接字 : Error (EINVAL) while trying to bind a sending socket to a port

java - 当我创建公共(public)类时,我遇到编译时错误,为什么?

java - 如何使用来自 Java 服务器的 JSON 将图像发送到 Javascript 客户端

java - 将 XML 序列化转换回 Java 代码

java - 收到 "javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted"此错误

android-3.0-honeycomb - 仅将我自己的应用程序作为 android 的默认应用程序启动