2016-03-21 77 views
0

我設計一個所有到所有Android程序,包括5個節點:設置S/C之間的TCP連接中的Android /爪哇

  1. 每個節點充當服務器和客戶端
  2. 每個節點將連接到其他4個節點。
  3. 每個節點將監聽並接受其他4個節點的連接。

雖然我的問題是,如果5個節點以1-2-3-4-5的順序啓動,Node1的tcp連接請求將不會被Node2接受,因爲Node2稍後啓動爲了解決這個問題,我試過使用isConnected(),但是即使只有Node1啓動,它總是會返回true。爲了解決這個問題,我試過使用isConnected(),但是它總是返回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..."); 
     } 
    } 
+0

'S/C'是什麼?短路? – EJP

+0

@EJP服務器/客戶端... – newbieSOF

+0

那麼爲什麼不這樣說呢?一切都不是TLA。可能是任何事情。 – EJP

回答

-1

做的#1和谷歌經過一番研究,我發現來檢測服務器是否在線的方式離線。我寫下面的注意事項以防其他人面對未來同樣的問題:>

而不是使用isConnected(),它將始終是true只要連接確實由客戶端發出,無論服務器在線與否,我們可以使用read()readLine()

read()將返回-1如果連接不實際安裝時,由於失去了連接,服務器關閉等

readLine()將計時的時候,在同樣的情況如上描述。

因此,我們可以檢查返回值是否爲-1或超時readLine()來檢查TCP連接的狀態。

+0

這裏到處都是錯誤。如果'read()'返回-1,'readLine()'將在相同的情況下返回'null',而不是永遠阻塞。在連接或接受套接字後,isConnected()將永遠返回true。它是套接字的屬性,而不是連接的屬性。如果連接丟失,'read()'將返回-1是不正確的。檢測可靠的唯一方法是發送。如果您可以區分服務器不活動和響應失敗,則讀取超時可以提供幫助。 – EJP

+0

@EJP Thx您的意見!我正在做一個項目並面臨不少TCP問題。從'read()'的返回值的文檔中,讀取下一個數據字節,如果到達流的末尾,則返回-1。那麼爲什麼我們不能說'如果連接已經丟失,read()將返回-1。 – newbieSOF

+0

因爲它可能永遠阻止。 'read()'不會發布任何網絡協議,所以它只是等待發生的事情,而且只有在嘗試發送它時纔會發生死連接。 – EJP