2010-06-01 11 views
6

Morgen.UDP-Übertragung in Java

Ich bin ziemlich neu in Java und Socket-Verbindungen, aber ich versuche, ein UDP-Paket/Broadcast auf 255.255.255.255 auf Port 8001 zu einem Gerät zu senden. Ich kann die Daten zum Senden erhalten, aber wenn es Zeit ist, die Daten zu empfangen, wird die Verbindung unterbrochen. Ich habe einen Paket-Sniffer und ich kann das Paket senden und dann das Gerät antworten.

Ich bin mir ziemlich sicher, dass es ein Anfängerfehler ist, dass ich in meinem Code vermisse, aber ich habe es eine Weile festgefahren und jede Hilfe würde geschätzt werden.

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

Danke und Gig'Em.

EDIT:

Ich bin nicht sicher, ob das hilft, aber wenn ich das m_Socket Objekt beobachten kann ich folgendes Recht sehen, bevor es sendet:

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

und das m_DataPack Objekt ist die folgende:

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

Sie wissen, dass Ihr Gig'Em einige Absolventen eines der größeren CS-Programme in Amerika verfremdet, richtig? – jasonmp85

+0

@ jasonmp85 für jene Nicht-Texaner, die sich wundern, was es bedeutet: https://en.wikipedia.org/wiki/Traditions_of_Texas_A%26M_University#Gig_.27em (ja, ich musste nachsehen;)) – Matthieu

Antwort

1

Wenn Sie ein Datagramm Sie auf den lokalen Endpunkt bind() müssen erhalten möchten (Adresse + Port).

+0

In der Bindung Funktion Ich muss den lokalen Endpunkt auf eine Adresse und einen Port über eine SocketAddress festlegen. Was ist der beste Weg, dies zu tun? Ich weiß in der DatagramPacket-Klasse gibt es eine getSocketAddress(); funktionieren so, dass mir das nicht weiterhilft. – user355528

+0

Ich habe versucht, m_DataPack = new DatagramPacket (Daten, data.length, InetAddress.getLocalHost(), m_SERVERPORT); und dann die m_Socket.bind (m_DataPack.getSocketAddress()); aber es wird eine Ausnahme ausgelöst, die besagt, dass der Socket bereits gebunden wurde. – user355528

+0

Er ist verbindlich, das ist was neue DatagramSocket (Int-Port) tut. – EJP

10

Dies ergibt keinen Sinn. Sie senden, das ist 1-zu-viele, und Sie verbinden auch, das ist 1 zu 1. Welches ist es?

Verlieren Sie die Verbindung. Und verlieren Sie die 255.255.255.255. Dies ist seit etwa 20 Jahren stark veraltet. Verwenden Sie eine Subnetz-lokale Broadcast-Adresse, z. 192.168.1.255.