在Android / Java中设置S / C之间的TCP连接

时间:2016-03-21 00:22:36

标签: android tcp multicast

我正在设计一个全面的Android程序,包括5个节点:

  1. 每个节点都充当服务器和客户端
  2. 每个节点将连接到其他4个节点。
  3. 每个节点将侦听并接受其他4个节点的连接。
  4. 虽然我遇到的问题是,如果5个节点按以下顺序启动:1-2-3-4-5,Node2将不接受Node1的tcp连接请求,因为Node2的启动时间晚于1。

    为了解决这个问题,我尝试使用isConnected(),但即使只启动了Node1,它也会返回true

    所以我的问题是如何在3个Android节点之间建立一个全对的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...");
            }
        }
    

1 个答案:

答案 0 :(得分:-1)

在从Stackoverflow和google进行一些研究之后,我找到了检测服务器是否在线脱机的方法。我正在撰写以下注释以防其他人在将来面临同样的问题:&gt;

我们可以使用isConnected()而不是使用true,只要连接确实是由客户端发出的,read()总是readLine()read()

如果连接未实际设置,

-1将返回readLine(),原因是连接丢失,服务器关闭等。

-1将一直在计时,与上述情况相同。

因此我们可以检查返回值是readLine()还是超时{{1}}来检查TCP连接的状态。