Доброе утро.
Я являюсь довольно новым в Java и сокетных соединениях, но я пытаюсь отослать пакет/широковещательную передачу UDP на 255.255.255.255 на порте 8001 к устройству. Я могу заставить данные отправлять очень хорошо, однако когда они прибывают время для получения данных время соединения. У меня есть анализатор пакетов, и я вижу, что пакет отправляет, и затем устройство отвечает.
Я вполне уверен, это - ошибка новичка, которую я пропускаю в своем коде, но я застрял на нем некоторое время, и любая справка ценилась бы.
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 возразить I видит следующее право, прежде чем это отправит:
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;
Если вы хотите получить дейтаграмму, вам нужно bind() к локальной конечной точке (адрес + порт).
Это не имеет смысла. Вы транслируете, что является 1 ко многим, и вы также соединяетесь, что является 1 к 1. Что из этого?
Потеряйте соединение. И потеряйте 255.255.255.255. Это уже 20 лет как устарело. Используйте локальный широковещательный адрес подсети, например, 192.168.1.255.