You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Studio Java Socket连接异常:本地IP正常,4G下公网IP无法连接

嘿,这个问题我太熟了——同局域网内跑的好好的,一切到4G公网就连不上,本质上是移动网络的**NAT(网络地址转换)**在搞鬼,咱们一步步拆解解决:

先搞懂核心问题:4G网络的公网IP不是你的手机IP

你服务器手机显示的183.90.37.22,大概率不是手机本身的真实IP,而是运营商基站的NAT网关IP。简单说,你的服务器手机现在处于运营商的“内网”里,外部设备(比如客户端的4G手机)直接访问这个公网IP,根本找不到你的服务器——就像你朋友只知道你小区的大门地址,不知道你家具体在哪栋楼哪层,自然敲不开你家门。

具体解决方案,按新手友好度排序

方案1:用云服务器做中转(最省心,新手首选)

找一台有固定公网IP的云服务器(比如阿里云、腾讯云的便宜轻量服务器,几十块钱就能用好久),写一个简单的中转程序:

  • 云服务器上运行一个Socket服务,负责同时接收客户端和服务器的连接请求;
  • 当两端都连上后,把客户端发过来的数据转发给服务器,再把服务器的响应转发给客户端;
  • 客户端和服务器都连接到云服务器的公网IP和端口,而不是直接互相连接。

这种方式完全不用管NAT的复杂逻辑,代码也简单,适合新手快速实现跨4G的通信。

方案2:端口转发(如果服务器能连到有公网IP的路由器)

如果你的服务器手机可以先连到家里/公司的宽带路由器(这个路由器有固定公网IP),那可以在路由器后台设置端口转发

  • 把路由器的某个公网端口(比如8080),映射到服务器手机的内网IP(比如192.168.1.4)和Socket端口;
  • 客户端直接用路由器的公网IP+转发端口连接就行。

方案3:STUN/TURN做NAT穿透(P2P方式)

如果想实现真正的手机对手机直接连接,就得用STUN或TURN服务器:

  • STUN服务器可以帮两台手机获取各自的公网映射地址(也就是运营商NAT给它们分配的对外端口);
  • 如果STUN没法穿透(比如遇到对称NAT),就用TURN服务器做中转。
    你可以自己用开源工具(比如coturn)在云服务器上部署STUN/TURN服务,然后让两端先和STUN服务器通信,拿到映射地址后再尝试直接连接。
几个必做的小检查
  • 服务器Socket绑定地址要对:别绑定到192.168.1.4这种内网IP,要绑定到0.0.0.0,这样才能接收来自任何网络的连接:
ServerSocket serverSocket = new ServerSocket(yourPort, 50, InetAddress.getByName("0.0.0.0"));
  • 检查权限和防火墙:确保APP申请了INTERNETACCESS_NETWORK_STATE权限,两台手机都关闭VPN/防火墙,避免连接被拦截;
  • 换个端口试试:有些运营商会屏蔽冷门端口,试试80、443或者10000以上的端口;
  • 设置合理的连接超时:4G网络延迟高,给客户端Socket设置10秒左右的超时,避免因为延迟导致连接失败:
Socket socket = new Socket();
socket.connect(new InetSocketAddress(publicIp, yourPort), 10000); // 10秒超时

内容的提问来源于stack exchange,提问作者Shi Jan

火山引擎 最新活动