2014-04-08 219 views
1

我正在開發一個Android應用程序。有一臺設備作爲服務器。客戶端設備可以連接到服務器設備。我想通過局域網來完成。我不確定這是最好的方式,但我開始做一個基於套接字的通信。客戶端無法連接到服務器套接字 - Android

這裏是我的服務器線程:

@Override 
public void run() { 
    Socket socket = null; 
    try { 
     serverSocket = new ServerSocket(7777); 
     while (!Thread.currentThread().isInterrupted()) { 
      try { 
       socket = serverSocket.accept(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

而且我有一個其他線程的通信...


現在,這裏是我的客戶線程:

public void run() { 
     try { 
      InetAddress serverAddress = InetAddress.getByName("10.0.2.2"); 
      socket = new Socket(serverAddress, 7777); 
      writer = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())), true); 
      writer.println("Hello!"); 
      writer.flush(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

問題是當客戶端嘗試連接到服務器時連接將會超時。


編輯:權限:

<uses-permission 
    android:name="android.permission.INTERNET"/>  
<uses-permission 
    android:name="android.permission.ACCESS_NETWORK_STATE"/> 
+0

你能通過telnet連接到10.0.2.2:7777嗎?如果您知道serverAddress IP,則不需要使用get ByName()。您可以連接新的套接字(「10.0.2.2」,7777)。 – SpeedEX505

+0

我不行。我收到了以下消息:「正在連接到10.0.2.2 ...無法打開與主機的連接,端口7777:連接失敗」 – Lyra

回答

0

最後我解決它。我停止用模擬器吮吸。我有2個Android設備。我將下一個代碼添加到服務器:

public static String getIPAddress() { 
    try { 
     List<NetworkInterface> interfaces = Collections.list(
       NetworkInterface.getNetworkInterfaces()); 
     for (NetworkInterface networkInterface : interfaces) { 
      List<InetAddress> addresses = Collections.list(
        networkInterface.getInetAddresses()); 
      for (InetAddress inetAddress : addresses) { 
       if (!inetAddress.isLoopbackAddress()) { 
        String sAddress = inetAddress.getHostAddress().toUpperCase(); 
        if (InetAddressUtils.isIPv4Address(sAddress)) { 
         return sAddress; 
        } else { 
         int delim = sAddress.indexOf('%'); 
         return delim < 0 ? sAddress : sAddress.substring(0, 
           delim); 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return ""; 
} 

現在我可以得到服務器地址,看起來像:192.168.1.X.我把它放在服務器設備上的TextView上,客戶端必須輸入這個IP才能連接到服務器。這對我來說就夠了,因爲我想在本地網絡上使用它。

相關問題