Flutter中如何实现192.168.0.x与192.168.1.x两个不同IP网段互通
跨网段通信前置网络配置
你当前的组网默认存在NAT隔离与广播域阻断,必须先完成路由配置,否则应用层代码无法实现跨段通信:
- 最简配置(推荐):将第二台路由器改为AP桥接模式
- 登录第二台路由器管理后台,关闭它的DHCP服务
- 将第二台路由器的LAN口IP修改为192.168.0.x网段内未被占用的固定IP(比如192.168.0.2),避免和第一台路由器的DHCP地址池冲突
- 保持第一台路由器过来的网线插在第二台的LAN口(不要插WAN口)
配置完成后两个网段会合并为同一个192.168.0.x广播域,下联设备自动在同一网段,不存在通信障碍。
- 保留双网段配置:
- 在第一台路由器上添加静态路由:目标网段
192.168.1.0/24,下一跳地址填写第二台路由器在192.168.0.x段的IP,出接口选择第一台路由器的LAN口 - 登录第二台路由器,关闭WAN口NAT功能,放通两个网段之间的转发防火墙规则,禁止拦截跨段ICMP、TCP、UDP流量
- 如果需要自动发现设备,还要在两台路由器上开启组播/广播转发,允许mDNS(224.0.0.251:5353)、SSDP这类发现协议的广播包在两个网段之间透传。
- 在第一台路由器上添加静态路由:目标网段
调试前先拿两台分别接在不同路由器下的设备互ping对端IP,确认网络层连通后再写应用层代码,绝大多数跨段通信问题都是路由配置错误导致的,和Flutter逻辑无关。
Flutter侧实现逻辑
根据你选的网络配置,对应选以下实现方案即可:
方案1:已合并网段/已开启组播透传
和普通同局域网开发逻辑完全一致,不需要特殊适配:
- 设备发现:直接用
multicast_dns插件发送mDNS广播查询即可搜索到对端网段的设备,核心示例代码:
import 'package:multicast_dns/multicast_dns.dart'; // 初始化mDNS客户端 final mDnsClient = MDnsClient(); await mDnsClient.start(); // 替换为你自己定义的服务标识 const serviceType = '_yourAppService._tcp.local'; try { await for (final ptrRecord in mDnsClient.lookup<PtrResourceRecord>( ResourceRecordQuery.serverPointer(serviceType), timeout: const Duration(seconds: 3), )) { // 进一步解析Srv、TXT记录拿到目标设备的IP、端口、设备信息 } } finally { mDnsClient.stop(); }
- 正常通信:拿到目标设备IP后,直接用
dio做HTTP请求、用dart:io的Socket/TCP/UDP类直连即可,没有额外限制。
方案2:无法配置路由器组播透传
跨网段默认不传输广播包,放弃广播自动发现逻辑,改用以下方式:
- 固定注册中心方案:在两个网段都能访问到的位置(比如第一网段下的固定IP设备、或者云服务器)搭一个极简的注册服务,所有设备启动后主动向这个固定地址上报自己的IP、端口、服务信息,其他设备需要发现对端时,直接请求注册中心拉取全量设备列表即可。
- 手动添加方案:如果设备量少,可以直接在应用内加手动输入IP的入口,让用户输入对端设备的IP后直接发起连接,不需要自动发现。
- 通信逻辑和同网段完全一致,只要路由通,直接拿IP建连即可,不需要额外做网络适配。
注意:不要尝试在Flutter应用层做广播包跨网段转发,系统层面会直接阻断非路由设备的广播转发行为,没有实际可行性。
内容的提问来源于stack exchange,提问作者Md. Jahid Hasan
相关产品推荐
相关产品推荐

