使用套接字在2个手机之间进行安卓聊天

时间:2012-08-25 19:24:47

标签: android sockets ip

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

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

更多信息:

我有一个程序可以在地图上显示用户位置,您可以点击它们开始聊天。我测试了socket连接,它在2个仿真器上工作正常,但是当我在手机上尝试它时,它无法连接套接字。

以上时间异常:

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

我最好的猜测是服务器的IP(也就是手机1)不对,或者端口被阻止或正在使用。

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


    }

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

提前致谢(抱歉英语)。

1 个答案:

答案 0 :(得分:0)

因此,虽然我对细胞基础设施的工作原理不太了解,但我只能想象它与任何ISP类似。

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

因此,除非你使用的是无线网络,否则很难在手机之间直接连接,因为它们在同一个可路由网络上的可能性非常低。