java - Android Socket Client Runnable 没有停止

标签 java android android-intent network-programming

我正在使用以下代码将客户端连接到服务器。问题是这不会终止,并且我无法在此之后开始新的 Activity 。

我认为问题要么是我没有关闭套接字,要么是线程没有终止。

我在onCreate()中启动线程

cThread = new Thread(new ClientThread());
cThread.start();

这是我的可运行

public class ClientThread implements Runnable {
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            socket = new Socket(serverAddr, 8080);
            connected = true;
            while (connected) {
                try {
                    Log.d("ClientActivity", "C: Sending command.");
                    PrintWriter out = new PrintWriter(new BufferedWriter(new
                      OutputStreamWriter(socket
                                .getOutputStream())), true);
                        // where you issue the commands

                        out.println(serverIpAddress);
                        Log.d("ClientActivity", "C: Sent.");

                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error while sending", e);
                }

                connected = false;
            }
            //socket.close();
            Log.d("ClientActivity", "C: Closed.");

        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error while connecting", e);
            connected = false;
        }

    }


}

最佳答案

你的程序毫无用处。假设套接字已建立,while 循环仅执行一次,因为在第一次迭代结束时,您将 connected 设置为 false,从而禁用任何进一步的循环。您不会刷新缓冲的输出以确保其被写入,并且您甚至不从套接字读取,所以我想知道您的自定义协议(protocol)是什么样的......此时,您的所有程序所做的只是将字符串写入服务器,然后退出。我们甚至无法告诉您为什么无法启动新 Activity ,因为在提供的代码中没有任何东西可以阻止您这样做。

TCP 协议(protocol)基本上有两种

  1. 基于请求-响应(如 HTTP,不适合聊天程序)。客户端建立连接,发出请求,读取响应,发出另一个请求,读取新响应等等,直到客户端完成其工作。图形客户端至少需要 2 个线程:一个用于 UI 更新,另一个用于网络通信。
  2. 客户端和服务器都会随机发送消息。这利用了套接字通信的全双工功能,但是 GUI 程序中至少需要三个线程:一个用于 UI,一个在套接字的输入流上阻塞,一个用于写入。事情会变得非常困惑,因为您可能会共享流并且必须手动同步。

如果这是另一个聊天程序,我建议不要设计自己的 TCP 协议(protocol),并从像 WebSockets 这样的标准技术开始。有Java clients可用,您可以在浏览器中简单地使用一些 Javascript 来测试您的服务器,并且服务器端还有更多选择( Socket.IO - 对于 JS 解决方案, Jetty, Glassfish ,...)。

当您获得一些经验并熟悉该工作后,您可以尝试设计自己的自定义 TCP 协议(protocol)。到那时,您至少已经了解了套接字、线程和 Android 编程的基础知识。

顺便说一句,您可能想看看 Service API用于不需要用户交互的后台任务。

关于java - Android Socket Client Runnable 没有停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12562251/

相关文章:

java - 在 ExceptionMapper<Throwable> 中捕获 JsonMappingException

java - 如何在一个pom文件中生成两个xmlbeans

java - 多次从 Kafka 读取同一条消息

android - 我可以知道从 Playstore 安装了我的应用程序的用户的电子邮件 ID

java - 获取从 llistview 中选择的项目,其中包含来自 Android Activity 的多个数据

java - OnEditorActionListener() 工作但无法从 EditText 获取文本

java - 对于源代码文件编码,ANSI 相对于更丰富的编码系统(例如 UTF-8)有什么好处吗?

android - Linux 互斥体必须是全局的?

java - 安卓 : Text Fields are displaying empty when returning to previous activity

android - 如何锁屏 Android