0

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

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

我开始线程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;
        }

    }


}
4

1 回答 1

1

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

TCP协议基本上有两种

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

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

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

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

于 2012-09-24T12:47:37.253 回答