早上 .
我是Java和套接字连接的新手,但我试图在端口8001上将255.255.255.255上的UDP数据包/广播发送到设备 . 我可以将数据发送得很好,但是当接收数据时,连接超时 . 我有一个数据包嗅探器,我可以看到数据包发送然后设备响应 .
我很确定这是我在代码中遗漏的新手错误,但我已经坚持了一段时间,任何帮助都会受到赞赏 .
m_Socket = new DatagramSocket(m_SERVERPORT);
InetAddress address = InetAddress.getByName(m_SERVERIP);
m_DataPack = new DatagramPacket(m_SERVERCMD.getBytes(), m_SERVERCMD.getBytes().length,
address, m_SERVERPORT);
m_Socket.setBroadcast(true);
m_Socket.connect(address, m_SERVERPORT);
m_Socket.send(m_DataPack);
m_DataPack = new DatagramPacket(data, data.length,
address, m_SERVERPORT);
m_Socket.receive(m_DataPack); // This is where it times out
data = m_DataPack.getData();
String received = data.toString();
System.out.println("Received: " + received);
m_Socket.close();
谢谢和Gig'Em .
编辑:
我不确定这是否有帮助但是当我观察m_Socket对象时,我可以在发送之前看到以下内容:
bound = true;
close = false;
connectedAddress = Inet4Address (id = 32) (-1,-1,-1,-1);
connectedPort = 8001;
connectState = 1;
created = true;
impl = PlainDatagramSocketImpl;
oldImpl = false;
并且m_DataPack对象如下:
address = Inet4Address (id = 32) (-1,-1,-1,-1);
bufLength = 6 (size of packet I'm sending is 6 char long);
offset = 0;
port = 8001;
4 回答
这没有意义 . 您正在广播,这是1对多,您也在连接,即1对1 . 这是什么?
失去连接 . 并输掉255.255.255.255 . 这已被大约弃用了大约20年 . 使用子网本地广播地址,例如192.168.1.255 .
您还可以查看Broadcasting to Multiple Recipients中描述的MulticastSocket . 希望这可以帮助 .
如果要接收数据报,则需要bind()到本地 endpoints (地址端口) .
您正在同一设备上发送和接收数据包 . 您可以分开发送和接收端口(例如,发送8001,接收8002) . 并将发送和接收代码作为单独的线程运行 . 如果两个设备必须找到彼此(或一个设备找到自己) .
接收:
发送:
当然应该把这段代码放在一个线程的循环中 . 基于此示例:https://demey.io/network-discovery-using-udp-broadcast/
更新
上面的链接已经死了 . 但是这里描述的方法也是:https://www.baeldung.com/java-broadcast-multicast