这有点长,所以我将从问题开始:如何在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
}
}
我对套接字没有多少经验。这是我第一次使用它们。我希望你们中的一个人有更多的经验,可以帮助我。
提前致谢(抱歉英语)。
答案 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通话,因为他们没有足够的信息来了解是否它们位于网络的同一物理段上。
因此,除非你使用的是无线网络,否则很难在手机之间直接连接,因为它们在同一个可路由网络上的可能性非常低。