2010-06-01 18 views
6

Rano.Transmisja UDP w języku Java

Jestem całkiem nowy w Java i połączenia z gniazdem, ale próbuję wysłać pakiet UDP/broadcast na 255.255.255.255 na porcie 8001 do urządzenia. Mogę wysłać dane do wysłania w porządku, ale gdy przychodzi czas na odebranie danych, czas połączenia jest przekroczony. Mam sniffer pakietów i widzę, jak pakiet wysyła, a następnie urządzenie odpowiada.

Jestem prawie pewien, że jest to błąd debiutanta, którego brakuje mi w moim kodzie, ale utknąłem na nim przez jakiś czas i każda pomoc byłaby doceniana.

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(); 

Dzięki i Gig'Em.

EDIT:

Nie jestem pewien, czy to pomoże, ale kiedy oglądam obiekt m_Socket widzę następujące tuż przed wysłaniem:

bound = true; 
close = false; 
connectedAddress = Inet4Address (id = 32) (-1,-1,-1,-1); 
connectedPort = 8001; 
connectState = 1; 
created = true; 
impl = PlainDatagramSocketImpl; 
oldImpl = false; 

a obiekt m_DataPack jest następujący:

address = Inet4Address (id = 32) (-1,-1,-1,-1); 
bufLength = 6 (size of packet I'm sending is 6 char long); 
offset = 0; 
port = 8001; 
+0

Zdajesz sobie sprawę, że twój Gig'Em zraża niektórych absolwentów jednego z większych programów CS w Ameryce, prawda? – jasonmp85

+0

@ jasonmp85 dla tych nie-Teksańczyków, którzy zastanawiają się, co to znaczy: https://en.wikipedia.org/wiki/Traditions_of_Texas_A%26M_University#Gig_.27em (tak, musiałem to sprawdzić;)) – Matthieu

Odpowiedz

1

Jeśli chcesz otrzymywać datagram trzeba bind() do lokalnego punktu końcowego (adres + port).

+0

W wiązaniu funkcja Muszę ustawić lokalny punkt końcowy na adres i port przez SocketAddress. Jaki jest najlepszy sposób na zrobienie tego? Wiem, że w klasie DatagramPacket istnieje getSocketAddress(); działa tak, że nie pomaga mi. – user355528

+0

Spróbowałem m_DataPack = new DatagramPacket (data, data.length, InetAddress.getLocalHost(), m_SERVERPORT); a następnie m_Socket.bind (m_DataPack.getSocketAddress()); ale zgłasza wyjątek mówiąc, że gniazdo zostało już powiązane. – user355528

+0

Jest wiążący, to właśnie robi nowy DatagramSocket (int port). – EJP

10

To nie ma sensu. Nadawałeś, czyli jeden-do-wielu, a ty też się łączysz, czyli 1-do-1. Który to jest?

Przerwij połączenie. I stracisz 255.255.255.255. Zostało to mocno wycofane przez około 20 lat. Użyj adresu emisji lokalnej podsieci, np. 192.168.1.255.