Java在Windows加入多播组时出现SocketException故障求助
Java MulticastSocket 加入多播组失败异常解决
异常信息
at java.net.TwoStacksPlainDatagramSocketImpl.join(Native Method) ~[?:1.8.0_211] at java.net.AbstractPlainDatagramSocketImpl.join(AbstractPlainDatagramSocketImpl.java:178) ~[?:1.8.0_211] at java.net.MulticastSocket.joinGroup(MulticastSocket.java:323) ~[?:1.8.0_211]
问题背景
该多播功能此前正常运行数月,近期突然失效。核心代码及参数如下:
变量定义
private String address = null; /** group */ private InetAddress group = null; /** port to broadcast over */ private int port = -1; /** connected multicast socket */ MulticastSocket socket = null;
加入多播组代码
group = InetAddress.getByName(address); socket = new MulticastSocket(port); socket.joinGroup(group);
参数值
- port = 4580
- address = 224.0.0.1
环境信息
- 操作系统:Windows 10 Home 10.0.19044 Build 19044
- 内存:40GB(32GB + 8GB)
- 处理器:i7-10510U
- Java版本:1.8.0_211
- IDE:Eclipse 2021-03 (4.19.0)
- Tomcat版本:9.0
- 额外软件:VMware、Wireshark(此前安装后无异常)
已尝试的无效操作
- 向JVM添加参数
-Djava.net.preferIPv4Stack=true - 代码中设置
System.setProperty("java.net.preferIPv4Stack", "true"); - 断开笔记本电脑网络连接
可行解决步骤
检查网卡多播启用状态
打开「网络连接」→右键当前使用的网卡→「属性」→「配置」→「高级」,找到多播相关选项(如Multicast Enable),确保设置为「启用」。不同网卡厂商的选项名称可能略有差异。排查端口占用
执行命令检查4580端口是否被其他进程占用:netstat -ano | findstr :4580若有占用,可更换端口或终止对应进程后重试。
指定网卡加入多播组
原代码自动选择网卡可能因系统网卡优先级变化失效,尝试指定具体本地网卡加入:// 替换为你的本地IPv4地址,如192.168.1.100 InetAddress localAddress = InetAddress.getByName("你的本地IPv4地址"); NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localAddress); socket.joinGroup(new InetSocketAddress(group, port), networkInterface);可通过
NetworkInterface.getNetworkInterfaces()遍历所有网卡,筛选出支持多播的网卡。重置Windows网络栈
执行以下命令重置网络,重启电脑后测试:netsh winsock reset netsh int ip reset排查VMware虚拟网卡影响
VMware创建的虚拟网卡可能干扰系统默认路由,暂时禁用VMware相关虚拟网卡(「网络连接」中右键禁用),再测试多播功能是否恢复。升级Java版本
Java 8u211存在部分网络底层bug,升级至Java 8u381及以上同系列版本,可修复部分Native方法异常。
内容的提问来源于stack exchange,提问作者Akila Uyanwatta
相关产品推荐
相关产品推荐

