You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何实现192.168.0.x与192.168.1.x两个不同IP网段互通

跨网段通信前置网络配置

你当前的组网默认存在NAT隔离与广播域阻断,必须先完成路由配置,否则应用层代码无法实现跨段通信:

  • 最简配置(推荐):将第二台路由器改为AP桥接模式
    1. 登录第二台路由器管理后台,关闭它的DHCP服务
    2. 将第二台路由器的LAN口IP修改为192.168.0.x网段内未被占用的固定IP(比如192.168.0.2),避免和第一台路由器的DHCP地址池冲突
    3. 保持第一台路由器过来的网线插在第二台的LAN口(不要插WAN口)
      配置完成后两个网段会合并为同一个192.168.0.x广播域,下联设备自动在同一网段,不存在通信障碍。
  • 保留双网段配置:
    1. 在第一台路由器上添加静态路由:目标网段192.168.1.0/24,下一跳地址填写第二台路由器在192.168.0.x段的IP,出接口选择第一台路由器的LAN口
    2. 登录第二台路由器,关闭WAN口NAT功能,放通两个网段之间的转发防火墙规则,禁止拦截跨段ICMP、TCP、UDP流量
    3. 如果需要自动发现设备,还要在两台路由器上开启组播/广播转发,允许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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:45:36