Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 两部手机之间的安卓聊天_Android_Sockets_Ip - Fatal编程技术网

Android 两部手机之间的安卓聊天

Android 两部手机之间的安卓聊天,android,sockets,ip,Android,Sockets,Ip,这有点长,所以我将从一个问题开始:如何让ip连接Android手机上的套接字(不是在专用网络上) 我如何检查一个端口是否被电话ISP阻塞 更多信息: 我有一个程序,可以在地图上显示用户的位置,你可以点击他们开始聊天。我已经测试了socket连接,它在2个模拟器上运行良好,但当我在手机上尝试时,它无法连接到套接字 上的超时异常: NotificationChat.ChatSocket = new Socket(serverAddr, 5000); 我最好的猜测是服务器(又名phone 1)的IP

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

我如何检查一个端口是否被电话ISP阻塞

更多信息:

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

上的超时异常:

NotificationChat.ChatSocket = new Socket(serverAddr, 5000);
我最好的猜测是服务器(又名phone 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;  */
}
我对插座没有太多经验。这是我第一次使用它们。我希望你们中的一位有更多的经验,可以帮助我


提前感谢(抱歉用蹩脚的英语)。

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

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


所以除非你使用的是wifi AP,仅仅因为它们在同一个可路由网络上的概率很低,就很难实现手机之间的直接连接。

这是有道理的,但我真的希望有一种方法可以让它工作到目前为止,谷歌让我失望了,所以我等着看其他人会在这里说什么:好的,那就是在此基础上,您可能会发现一些价值:更具体地说,我有点昏昏欲睡,但我只是遇到了同样的东西,叫做Lidgren。有人知道这是否能解决我的问题吗?
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
            }


    }