2013-04-27 89 views
0

我已經寫了一個服務器套接字活動,並在C#中的客戶端。但我的C#客戶端永遠不會連接到android服務器。 雖然搜索我發現了這個問題。 java.net.ServerSocket.accept() doesn't return on Android服務器套接字不聽正確的IP地址

我的服務器套接字正在監聽ServerSocket [addr = 0.0.0.0/0.0.0.0,端口= 0,localport = 5000])而不是10.0.2.15.Kindly指引我朝着正確的方向。

private String getLocalIpAddress() { 
    try { 
     for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
      NetworkInterface intf = en.nextElement(); 
      for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
       InetAddress inetAddress = enumIpAddr.nextElement(); 
       if (!inetAddress.isLoopbackAddress() 
         && InetAddressUtils.isIPv4Address(inetAddress.getHostAddress())) { return inetAddress.getHostAddress().toString(); } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e("ServerActivity", ex.toString()); 
    } 
    return null; 
} 

public class ServerThread implements Runnable { 

     public void run() { 
      try { 
       if (SERVERIP != null) { 
        handler.post(new Runnable() { 
         @Override 
         public void run() { 
          serverStatus.setText("Listening on IP: " + SERVERIP); 
         } 
        }); 
        serverSocket = new ServerSocket(SERVERPORT); 
        while (true) { 
         // LISTEN FOR INCOMING CLIENTS 
         Socket client = serverSocket.accept(); 
         handler.post(new Runnable() { 
          @Override 
          public void run() { 
           serverStatus.setText("Connected."); 
          } 
         }); 

         try { 
          BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
          String line = null; 
          while ((line = in.readLine()) != null) { 
           Log.d("ServerActivity", line); 
           handler.post(new Runnable() { 
            @Override 
            public void run() { 

            } 
           }); 
          } 
          break; 
         } catch (Exception e) { 
          handler.post(new Runnable() { 
           @Override 
           public void run() { 
            serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones."); 
           } 
          }); 
          e.printStackTrace(); 
         } 
        } 
       } else { 
        handler.post(new Runnable() { 
         @Override 
         public void run() { 
          serverStatus.setText("Couldn't detect internet connection."); 
         } 
        }); 
       } 
      } catch (Exception e) { 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         serverStatus.setText("Error"); 
        } 
       }); 
       e.printStackTrace(); 
      } 
     } 
    } 

回答

1

移動設備作爲服務器工作的可能性取決於您的移動互聯網提供商的防火牆配置。通常這是禁用的。只有在通過無線而不是移動寬帶連接設備時,此類連接纔有效。

0.0.0.0無論如何都是無效地址。嘗試獲取主機地址時忽略它。

+0

我想在我的模擬器上測試這個應用程序!無論如何要完成這件事? – Desire 2013-04-27 16:59:36

+1

0.0.0.0不是'無效地址'。 – EJP 2013-04-27 21:32:53

+0

它用於指定指定無效,未知或不適用的目標,且不可路由。 – h22 2013-04-28 09:48:58

0

的ServerSocket上正確的IP地址不聽

是的。 ServerSocket返回0.0.0.0作爲本地地址沒有任何問題。那是INADDR_ANY。這僅表示它將通過任何本地接口接受連接。這不是你的問題。

+0

但是當我試圖在C#客戶端使用IPAddress.Any!它仍然不起作用 – Desire 2013-04-27 21:47:00

+0

你已經在使用它。這就是爲什麼你看到0.0.0.0。這是默認設置。通過明確指定,你沒有改變任何東西。這不是問題。 – EJP 2013-04-27 22:30:46