今天开发Java后端的过程中遇到一个情况,WIFI信号传输出现了跨网段问题,分析了一下原因然后写下来,记录一下不同网段的TCP服务端和客户端如何互通。
我的一个嵌入式项目会启动一个TCP服务端,端口为8088,这个服务端用于处理其余嵌入式设备的WIFI通信。
目前我的电脑内网网段是173.16网段,IP为173.16.0.66,使用网线连接电脑。
对接这个项目的WIFI模块是192.168网段,是网关同时是TCP客户端,网关IP是192.168.4.1。
将电脑的WIFI连接上这个WIFI模块AP的WIFI,分配到的IP是192.168.4.2,现在的问题是,如何解决让这个WIFI模块内置的TCP客户端连接到我的TCP服务器。
现在的电脑有两个网卡 IP:
- 有线网卡:
173.16.0.66 - WIFI 网卡:
192.168.4.2
WIFI 模块在 192.168.4.0/24 网段,模块 IP 是 192.168.4.1。
WIFI模块作为 TCP 客户端,只能直接访问同网段的 192.168.4.2,也就是我们的电脑WIFI网卡。
WIFI模块网关地址为192.168.4.1
电脑的网关地址为173.16.0.1
默认情况下,不同网段的IP无法互相通信。它无法直接访问 173.16.0.66,除非你额外配置路由、NAT 或桥接。电脑与WIFI模块不是同一个网段,默认环境直接连接必然不互通。所以直接配置连接173.16.0.66必然不行。
最后研究出来的解决方案很简单,修改TCP服务端的监听地址,使其监听所有网卡信息活动。此时TCP服务端会监听你的设备所有网卡地址,包括但不限于电脑的WIFI网卡。
让 WIFI 模块连接你的 TCP 服务端,目标地址填 192.168.4.2:8088。这个地址是电脑的WIFI网卡的地址,因为开启了全网卡监听,所以WIFI网卡也会成为有效的TCP服务器访问地址。
请确保你的 TCP 服务端监听在 WIFI 网卡上,或者监听 0.0.0.0:8088。
需要注意,能连上不是因为WIFI模块在 192.168.4.1 跨网段访问了 173.16.0.66,而是因为它实际连接的是你电脑 WiFi 网卡上的 192.168.4.2:8088。
它们处于一个网段可以直接二层通信,不需要路由器,也不需要访问 173.16.0.66。而TCP服务器现在监听了电脑所有网卡,
这里再解释一下0.0.0.0的IP配置
0.0.0.0 不是某一个具体 IP。它表示“监听本机所有 IPv4 网卡地址”。
以我的电脑来说,电脑当前有这些地址:
- 有线网卡:
173.16.0.66 - WiFi 网卡:
192.168.4.2
因此同一个 TCP 服务同时接受:
-
173.16.0.66:8088 -
192.168.4.2:8088 -
127.0.0.1:8088 - 其他本机 IPv4 地址上的
8088
概念说完了,下面是简化版的配置步骤。
1.确认 Java TCP 服务监听地址
验证方式:Windows 执行 netstat -ano | findstr :8088。
如果看到 0.0.0.0:8088,说明所有网卡都能访问。
如果看到 173.16.0.66:8088,说明只监听有线网卡,WIFI 模块连不上,此时需
要修改TCP服务端监听地址。
2.修改 TCP 服务监听地址
推荐监听:0.0.0.0:8088。
或者监听 WIFI 网卡:192.168.4.2:8088。
注意,此方式只监听WIFI网卡,电脑网卡会被忽略。
3.配置 WIFI 模块 TCP 客户端
目标 IP 填:192.168.4.2。目标端口填:8088。
不要填 192.168.4.1,此IP是WIFI模块自己的网关与IP地址。
也不要填 173.16.0.66,它不在模块直连网段内,这是电脑有线网卡IP。
4.检查项目IP端口绑定配置
如果项目里有类似配置,配置TCP服务端的绑定IP:
server.host=173.16.0.66
tcp.host=173.16.0.66
tcp.bind-address=173.16.0.66
因为WIFI模块与电脑不在一个网段,应改成:
server.host=0.0.0.0
tcp.host=0.0.0.0
tcp.bind-address=0.0.0.0
总结一下最后的配置流程:
- 电脑 WIFI IP:
192.168.4.2 - TCP 服务端监听:
0.0.0.0:8088 - WIFI 模块 TCP 客户端目标:
192.168.4.2:8088 - 检查后端确认连接成功,模块与后端成功通信
