0

这有点长,所以我将从问题开始:如何让 ip 连接 Android 手机上的套接字(不在专用网络上)?

以及如何检查电话 ISP 是否阻止了端口?

更多信息:

我有一个程序可以在地图上显示用户位置,您可以单击它们并开始聊天。我已经测试了套接字连接,它在 2 个模拟器上运行良好,但是当我在手机上尝试时,它无法连接套接字。

超时异常:

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

我最好的猜测是服务器(又名电话 1)的 IP 不正确,或者端口可能被阻止或正在使用中。

我尝试了两种获取电话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
            }


    }

我对套接字没有太多经验。这是我第一次使用它们。我希望你们中的一个人有更多的经验,可以帮助我。

在此先感谢(对不起,绉纱英语)。

4

1 回答 1

0

因此,虽然我不太了解蜂窝基础设施的工作原理,但我只能想象它与任何 ISP 都相似。

因此,想象一下您是一家拥有数百万客户的大型运营商。你不能给他们每个人自己保留的公共 IP,这将是昂贵和低效的。但是您必须为他们提供 IP 才能向他们发送数据。因此,您基本上将您的网络划分为多个部分。每个网段都有完整的私有 ip 网络。由于电话上的大多数连接都不是点对点的,因此可以安全地假设所有出站流量都通过一个网关或一组网关,直到它到达一个公共网关,该网关将把消息中继到任何公共主机被请求的地方。但是,无论该网关的 IP 是什么,您的服务器(以及 Internet 上的任何服务器)都可能将其视为客户端 IP(这可能与客户端报告的 IP 不同)。所有设备都以这种方式运行,假设您不能仅从同一网络中的可路由 IP 连接到 10.227.130.191 也是安全的,除非它有一个打开的端口,在这种情况下,这可能意味着运行您的软件。我认为手机的物理接近度可能会在某种程度上发挥作用,决定两部不同的手机放在哪个私人部分。然而在大多数情况下,仅仅因为他们没有足够的信息来知道是否有足够的信息来判断位于 Lat1、Lng1 IP 10.127.xx 的电话 A 可以与位于 Lat1、Lng1 IP 10.127.xy 的电话 B 通话,这还不够可预测。它们位于网络的同一物理段上。我认为手机的物理接近度可能会在某种程度上发挥作用,决定两部不同的手机放在哪个私人部分。然而在大多数情况下,仅仅因为他们没有足够的信息来知道是否有足够的信息来判断位于 Lat1、Lng1 IP 10.127.xx 的电话 A 可以与位于 Lat1、Lng1 IP 10.127.xy 的电话 B 通话,这还不够可预测。它们位于网络的同一物理段上。我认为手机的物理接近度可能会在某种程度上发挥作用,决定两部不同的手机放在哪个私人部分。然而在大多数情况下,仅仅因为他们没有足够的信息来知道是否有足够的信息来判断位于 Lat1、Lng1 IP 10.127.xx 的电话 A 可以与位于 Lat1、Lng1 IP 10.127.xy 的电话 B 通话,这还不够可预测。它们位于网络的同一物理段上。

因此,除非您在 wifi AP 上,否则很难允许手机之间直接连接,因为它们位于同一个可路由网络上的可能性非常低。

于 2012-08-25T23:17:29.470 回答