在 Android/Java 中的 S/C 之间建立 TCP 连接

Setting up TCP connections between S/C in Android/Java

我正在设计一个all-to-allAndroid程序,包括5个节点:

  1. 每个节点同时充当服务器和客户端
  2. 每个节点都会连接到其他 4 个节点。
  3. 每个节点都会监听并接受其他 4 个节点的连接。

虽然我遇到的问题是,如果 5 个节点按以下顺序启动:1-2-3-4-5,Node1 的 tcp 连接请求将不会被 Node2 接受,因为 Node2 的启动时间晚于1.

为了解决这个问题,我试过使用 isConnected(),但它总是 returns true 即使只启动了 Node1。

所以我的问题是如何在 3 个 Android 节点之间建立 all-to-all TCP 连接。

附上我的代码:

private class ClientTask extends Thread {
        Socket[] s1 = new Socket[5];

        @Override
        public void run() {
            int flag=1;
            for (int i = 0; i < 5; i++) {
                if(flag==0) i--;
                try {
                    System.out.println("Begin making connections!");
                    //s1[i] = new Socket(InetAddress.getByAddress(new byte[]{10, 0, 2, 2}),REMOTE_PORT[i]);
                    s1[i] = new Socket();
                    s1[i].connect(new InetSocketAddress("10.0.2.2", REMOTE_PORT[i]),1000);
                    flag=1;
                } catch (UnknownHostException e) {
                    System.out.println("ClientTask UnknownHostException");
                    flag=0;
                } catch (IOException e) {
                    //Error happens when set_redir.py is not run
                    System.out.println("ClientTask socket IOException");
                    flag=0;
                }
            }
        }
    }

服务器代码:

public class ServerTask extends Thread {
        ServerSocket serverSocket = null;

        public void run() {
            System.out.println("Start listening!");
            Socket socket = null;
            try {
                serverSocket = new ServerSocket(10000);
            } catch (IOException e) {
                System.out.println("Error when creating serversocket!");
            }
            int flag=1;
            for (int i = 0; i < 5; i++) {
                if(flag==0) i--;
                try {
                    // waiting for incoming socket
                    socket = serverSocket.accept();
                    DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                    try{
                        out.writeBytes("You are connected to avd: " + (myPort-11108)/4);
                    }catch (IOException e){
                        System.out.println("Error here!");
                    }
                    flag=1;
                    // new thread for the full TCP connection
                    System.out.println("Receiving new TCP connection from " + socket.getRemoteSocketAddress());
                    tt[i] = new tcpThread(socket, i);
                    tt[i].start();
                } catch (IOException e) {
                    System.out.println("ERROR: server socket");
                    flag=0;
                }
            }
            System.out.println("End listening...");
        }
    }

在从 Whosebug 和 google 做了一些研究后,我找到了检测服务器是在线还是离线的方法。我正在写以下笔记,以防其他人将来遇到同样的问题:>

而不是使用isConnected(),只要连接确实是由客户端发出的,它总是true,无论服务器在线与否,我们可以使用[=12] =] 或 readLine().

read() 将 return -1 如果由于连接丢失、服务器关闭等原因实际未建立连接

readLine() 将一直计时,情况与上述相同。

因此我们可以检查 return 值是否为 -1 或超时 readLine() 以检查 TCP 连接的状态。