Android Socket Client Runnable没有停止

时间:2012-09-24 09:29:12

标签: java android android-intent network-programming

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

我认为问题是我不关闭套接字或线程没有终止。

我在onCreate()

中启动帖子
cThread = new Thread(new ClientThread());
cThread.start();

这是我的Runnable

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;
        }

    }


}

1 个答案:

答案 0 :(得分:1)

你的程序很无用。假设套接字已建立,while循环仅执行一次,因为在第一次迭代结束时,您将connected设置为false,从而禁用任何进一步的循环。你不要刷新你的缓冲输出以确保它被写入,而你甚至不能从套接字读取,所以我想知道你的自定义协议是什么样的..此时,您的所有程序都只是将一个字符串写入服务器,然后退出。我们甚至无法说明您无法开始新活动的原因,因为在提供的代码中没有什么可以阻止您这样做。

基本上有两种TCP协议

  1. 基于请求 - 响应(如HTTP,不适合聊天程序)。客户端建立连接,发出请求,读取响应,发出另一个请求,读取新响应等等,直到客户端完成其工作。图形客户端至少需要2个线程:一个用于UI更新,另一个用于网络通信。
  2. 客户端和服务器都会随机发送消息。这利用了套接字通信的全双工功能,但是您在GUI程序中至少需要三个线程:一个用于UI,一个在套接字的输入流上被阻塞,一个用于写入。事情变得非常混乱,因为你可能会共享流并且必须手动同步。
  3. 如果这是另一个聊天程序,我建议不要设计自己的TCP协议,并从像WebSockets这样的标准技术开始。有Java clients可用,您可以在浏览器中使用一些Javascript测试您的服务器,并且在服务器端有更多选择(Socket.IO - 对于JS解决方案,{{3 },...)。

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

    顺便说一句,您可能需要查看Jetty, Glassfish以了解不需要用户互动的后台任务。