2012-08-25 35 views
0

這有點長,所以我將從這個問題開始:如何在Android手機上使用IP鏈接套接字(而不是專用網絡)?使用套接字的兩部手機之間的Android安卓聊天

我該如何檢查一個端口是否被手機ISP阻止?

多一點信息:

我有一個程序,在地圖上顯示用戶的位置,你可以點擊它們,開始聊天。我已經測試了套接字連接,並且它在2個仿真器上工作正常,但是當我在手機上嘗試時,它無法連接套接字。

出時間異常的:

NotificationChat.ChatSocket = new Socket(serverAddr, 5000); 

而且我最好的猜測是服務器(又名手機1)的IP是不正確的,或者也許是端口被阻塞或在使用中。

我嘗試2種方式來獲得手機IP:

public static String getLocalIpAddress() {  
    try { 
     Socket socket = new Socket("www.google.com", 80); 
     Log.i("iptest", socket.getLocalAddress().toString().substring(1)); 
     String ip=socket.getLocalAddress().toString().substring(1); 
     socket.close(); 
     return ip; 

    } catch (Exception e) { 
     Log.i("", e.getMessage()); 
     return "exception in get ip"; 
    } 

    /* 
    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()) { 
        return inetAddress.getHostAddress().toString(); 
       } 
      } 
     } 
    } catch (SocketException ex) { 
     Log.e("b2264", ex.toString()); 
    } 
    return null; */ 
} 

IP我得到的是:10.227.130.191 哪個,如果我記得沒錯是A級本地IP。

服務器端:

while(flag==1) 
    { 
     if(ss==null) 
     { 
      try { 
        ss = new ServerSocket(SERVERPORT); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       }      
     } 
      try { 
        Log.d("thread","chatnotifiction befor ss accpect"); 
        Socket NotAvilabale=null; 
        NotAvilabale = ss.accept(); 
        if(ChatSocket!=null) 
        { 
         Log.d("test55","not avilable"); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(NotAvilabale.getOutputStream())),true); 
         out.println("notav"); 
         NotAvilabale.close(); 
         continue; 
        } 
        ChatSocket=NotAvilabale; 
        Log.d("thread","chatnotifiction after ss accpect"); 
        CharSequence contentText = "someone wants to talk to you"; 

        PendingIntent contentIntent = PendingIntent.getActivity(this, 1, notificationIntent, 2); 

        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);   

        mNotificationManager.notify(NOTIFI_ID, notification); 
      } catch (IOException e) { 
       Log.d("chat notifi io exception","chat notifi io exception "); 
        e.printStackTrace(); 
      }catch (Exception e) { 
       Log.d("chat notifi Exception 2","chat notifi Exception 2 "); 
       // TODO: handle exception 
      } 


    } 

我沒有與插座很多經驗。這是我第一次使用它們。我希望你們中的一個有更多的經驗並能幫助我。

在此先感謝(抱歉英語crape)。

+0

有點睡覺,但我只是跑到相同的事情馴鹿Lidgren任何人都知道,如果這將解決我的問題? – user1246950

回答

0

因此,雖然我對細胞基礎設施的工作方式知之甚少,但我只能想象它與任何ISP類似。

想象一下,你是一家擁有數百萬客戶的大型航空公司。你不能給他們所有的保留的公有IP地址,這將是昂貴和低效的。但是你必須給他們IP才能發送數據給他們。所以你基本上把你的網絡分成多個部分。每個細分市場都擁有完整的私有ips網絡。由於手機上的大多數連接都不是對等的,因此假設所有出站流量都通過一個網關或一組網關,直到它到達一個公共網關,該網關將中繼該公共主機所請求的信息。無論網關的IP是什麼,都可能是你的服務器(以及互聯網上的任何服務器)會看作客戶端IP(這可能與客戶端報告的IP不一樣)。在所有設備以這種方式工作的情況下,假設您不能僅僅通過同一網絡中的可路由IP與10.227.130.191建立連接,除非它打開了一個端口,在這種情況下可能意味着運行你的軟件。我認爲手機的物理接近度可能會在某種程度上發揮作用,以決定兩個不同的手機將哪個私人分組放在一起。然而,在大多數情況下,無法預知Lat1的電話A,Lng1 IP 10.127.xx可以與Lat1的電話B,Lng1 IP 10.127.xy通話,這僅僅是因爲他們沒有足夠的信息來知道是否他們位於網絡的同一物理部分。

所以,除非你使用wifi AP,否則僅僅因爲它們在同一個可路由網絡上的可能性非常低,所以實際上很難允許電話之間的直接連接。

+0

它使敏感,但我真的希望有一種方法,使其工作到目前爲止谷歌faild我等待看看別人會在這裏說:P thx – user1246950

+0

好吧,那麼你可能會發現一些價值與此:http://www.brynosaurus.com/pub/net/p2pnat/更具體http://www.brynosaurus.com/pub/net/p2pnat/#sec-tcp-steps –