使用树莓派64位的系统,jdk17,接收不到udp数据,netstat -nulp显示端口监听在udp6上,禁用udp6之后还是收不到,但是写的发送能从另一台电脑上收到数据.接收的代码如下:
```
public static void main(String[] args) {
try {
if(!loadFile(args)){
System.out.println("加载配置文件异常!"+ Arrays.toString(args));
return;
}
final MulticastSocket orgSocket = getOrgSocket();
new Thread(()->{
try {
DatagramPacket inpack = new DatagramPacket(new byte[1500], 1500);
while (true) {
try {
//数据接收
orgSocket.receive(inpack);
System.out.println(Arrays.toString(inpack.getData()));
} catch (SocketTimeoutException e) {
//如果是接收超时了 那么跳过这次循环 不需要继续向下走
//超时是正常的 所以不需要打印报错 日志提醒即可
System.out.println("数据接收等待超时:"+configInfo());
continue;
}
}
// System.out.println("===============接收已经关闭成功===============");
} catch (Exception e) {
e.printStackTrace();
} finally {
if(orgSocket!=null){
orgSocket.close();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取接收组播socket
* @return
* @throws IOException
*/
private static MulticastSocket getOrgSocket() throws IOException {
SocketAddress bindaddr = new InetSocketAddress(localip, orgport);
MulticastSocket sock = new MulticastSocket(bindaddr);
// MulticastSocket sock = new MulticastSocket(relayConfig.getOrgport());
sock.setInterface(InetAddress.getByName(localip));
InetAddress bcAddr = InetAddress.getByName(orgip);
System.out.println("初始化接收组播信息:" + configInfo());
System.out.println();
// 创建socket并加入组播地址
// sock.joinGroup(bcAddr);
sock.joinGroup(new InetSocketAddress(bcAddr,orgport), NetworkInterface.getByName(localip));
//sock.setLoopbackMode(false); // 必须是false才能开启广播功能!!
sock.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false);
//设置每次接收的超时时间
//如果不设置 接收不到数据会一直阻塞 如果先关闭了广播 就无法停止接收会一直监听 消耗系统资源
//设置超时时间后 如果超过此时间(毫秒) 未接收到数据 会跳过continue循环
sock.setSoTimeout(3000);
return sock;
}
private static String configInfo() {
return "localip:"+localip+",orgip:"+orgip+",orgport:"+orgport+",tarip"+tarip+",tarport:"+tarport;
}
```