UDP Anfrage / keine Antwort
Jan
- java
0 Andreas Korthaus0 Jan0 Andreas Korthaus0 Jan
0 Martin Jung0 Andreas Korthaus0 Jan
0 Jan
0 Dominik0 Jan
Hallo,
wollte mittels Java eine Anfrage auf meinem Server machen, über den Port 4665(UDP). Leider bekomm ich keine Antwort, sprich der Thread hängt bei der receive(packet) Funktion (blockiert bis Packet empfangen wurde).
hier der Code:
while (true)
{
DatagramPacket packet;
try {
String sendMsg = "E3965A000000";
byte data[] = sendMsg.getBytes();
InetAddress ia = InetAddress.getByName("localhost");
packet = new DatagramPacket(data, data.length, ia, 4665);
socket = new DatagramSocket();
socket.send(packet); // send the packet note: when no service
// is ready on the remote-side to listen, a
// IP-interrupt `Connection refused' will be
// sent back and Socket.send() will generate
// an IOExcepetion the next time called
socket = new DatagramSocket();
packet = new DatagramPacket(data, data.length);
socket.receive(packet); // waiting for response
System.out.println("port: " + packet.getPort() + "\n" +
"address: " + packet.getAddress() + "\n" +
"data: " + packet.getData());
socket.close(); // close socket
Thread.sleep(1000); // sleep 1 second
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Weiss einer vielleicht wo da noch ein Denkfehler drin steckt ? Hätte einen Codeschnipsel noch von Perl von ocbMaurice, ist in php auch ziemlich gleich. Aufjedenfall bekommt man auf diesem Weg eine Antwort vom Server.
()
use IO::Socket;
use constant MAXLEN => 14;
my $ip="0.0.0.0";
my $port="4665";
my $answer; my $users=-1; my $files=-1;
my $reciever="\xE3\x97\x5A\x00\x00\x00";
my $sender="\xE3\x96\x5A\x00\x00\x00";
$SIG{ALRM}=sub { &error(); $sock->close(); exit };
alarm 2;
$sock=new IO::Socket::INET(Proto => 'udp',PeerAddr => $ip,PeerPort => $port,TimeOut => 5) or &error;
$sock->send($sender) or &error;
$sock->recv($answer, MAXLEN, 0) or &error;
.
.
.
Für jede Hilfe wäre ich dankbar! Lesen und suchen hat mich nicht sehr viel weiter gebracht ...
Habe irgendwie das Gefühl, das es an dem String "sendMsg" liegt, hab das schon mit 0x und den ganzen Varianten probiert, hat aber auch nichts gebracht.
Mfg Jan
Hi!
wollte mittels Java eine Anfrage auf meinem Server machen, über den Port 4665(UDP).
Warum ausgerechnet UDP? TCP wäre wohl einfacher ;-)
Leider bekomm ich keine Antwort, sprich der Thread hängt bei der receive(packet) Funktion (blockiert bis Packet empfangen wurde).
Woher weißt Du dass es gnau an dieser Stelle hängt?
hier der Code:
while (true)
{
DatagramPacket packet;
try {
Es mag sein dass das egal ist, aber ich kenne das nur anders herum:
try {
DatagramPacket packet;
while (true) {
// [...]
}
}
catch ( Exception e ) {
System.out.println( e );
}
String sendMsg = "E3965A000000";
byte data[] = sendMsg.getBytes();
InetAddress ia = InetAddress.getByName("localhost");
packet = new DatagramPacket(data, data.length, ia, 4665);
socket = new DatagramSocket();
socket.send(packet); // send the packet note: when no service
// is ready on the remote-side to listen, a
// IP-interrupt `Connection refused' will be
// sent back and Socket.send() will generate
// an IOExcepetion the next time called
Ich sehe keinen Fehler(was nichts heißt :-)), nur wenn ich den Kommentar richtig deute, kanst Du evtl. auch hier einen Fehler abfragen?
socket = new DatagramSocket();
packet = new DatagramPacket(data, data.length);
socket.receive(packet); // waiting for response
vermutlich hier ebenfalls
System.out.println("port: " + packet.getPort() + "\n" +
"address: " + packet.getAddress() + "\n" +
"data: " + packet.getData());
vielleicht "new String( packet.getData()"?
socket.close(); // close socket
Thread.sleep(1000); // sleep 1 second
}
catch (Exception e) {
e.printStackTrace();
was gibt das aus?
}
}
}
Weiss einer vielleicht wo da noch ein Denkfehler drin steckt ? Hätte einen Codeschnipsel noch von Perl von ocbMaurice, ist in php auch ziemlich gleich. Aufjedenfall bekommt man auf diesem Weg eine Antwort vom Server.
hm.
Habe irgendwie das Gefühl, das es an dem String "sendMsg" liegt, hab das schon mit 0x und den ganzen Varianten probiert, hat aber auch nichts gebracht.
Vielleicht hilft Dir: http://www.galileocomputing.de/openbook/javainsel2/java_160013.htm#Rxxjava_160013346DieZeitdiensteundeineigenerServerundClient
Grüße
Andreas
PS: Es würd mich interessieren woran es am Ende gelegen hat.
Das mit dem try and catch hat ich schon an den markanten Stellen, es wird aber nie ein Fehler ausgegeben, hatte vergessen das Kommentar rauszunehmen, sorry ist so ein bisschen Irreführend. Die Methode "socket.receive(packet);" wartet so lange bis eine Antwort vom Server, also ein Packet von diesem wieder ankommt. Weil kein Packet kommt, macht er an dieser Stelle auch nicht weiter.
JavaInsel hat mir an der Stelle auch nicht weiterhelfen können.
Mfg Jan
Hi!
Das mit dem try and catch hat ich schon an den markanten Stellen, es wird aber nie ein Fehler ausgegeben, hatte vergessen das Kommentar rauszunehmen, sorry ist so ein bisschen Irreführend. Die Methode "socket.receive(packet);" wartet so lange bis eine Antwort vom Server, also ein Packet von diesem wieder ankommt. Weil kein Packet kommt, macht er an dieser Stelle auch nicht weiter.
Dann las doch mal Ethereal mitlaufen und gucke was genau auf der Netzwerkkarte passiert, hierzu musst Du natürlich über dieses Interface gehen, nicht über localhost!
Grüße
Andreas
Dann las doch mal Ethereal mitlaufen und gucke was genau auf der Netzwerkkarte passiert, hierzu musst Du natürlich über dieses Interface gehen, nicht über localhost!
Grüße
Andreas
Danke für den Tipp, werd das gleich mal ausprobieren ;)
Hi,
Die Methode "socket.receive(packet);" wartet so lange bis eine Antwort vom Server, also ein Packet von diesem wieder ankommt. Weil kein Packet kommt, macht er an dieser Stelle auch nicht weiter.
Um diese Art von Problemen zu umgehen, gibt es seit jdk 1.4.x das NIO package (Stichwort: 'Non-blocking I/O'). Ein Blick darauf könnte sich in Deinem Falle lohnen - Pakete herbeizaubern kann man damit aber sicherlich nicht ;-)
Viele Grüße,
Martin Jung
Hi!
Die Methode "socket.receive(packet);" wartet so lange bis eine Antwort vom Server, also ein Packet von diesem wieder ankommt. Weil kein Packet kommt, macht er an dieser Stelle auch nicht weiter.
Also ich habe von Java eigentlich gar keine Ahnung, und bin nur dabei mich mit dem Insel-Buch etwas einzulesen, könnt Ihr mir vielleicht verraten woher man wissen kann an welcher Stelle des Programms gewartet wird? Würde mich interessieren!
Grüße
Andreas
Hi!
Die Methode "socket.receive(packet);" wartet so lange bis eine Antwort vom Server, also ein Packet von diesem wieder ankommt. Weil kein Packet kommt, macht er an dieser Stelle auch nicht weiter.
Also ich habe von Java eigentlich gar keine Ahnung, und bin nur dabei mich mit dem Insel-Buch etwas einzulesen, könnt Ihr mir vielleicht verraten woher man wissen kann an welcher Stelle des Programms gewartet wird? Würde mich interessieren!Grüße
Andreas
Es reicht schon wenn du einfach mal hinter "socket.receive(packet);" mit "printline" ne Zeile ausgeben lässt, wenn diese Zeile nicht mehr angezeigt wird weisst du schon das das Programm (in diesem Fall der Thread) an dieser Stelle anhält ;)
Mfg Jan
Hi!
Es reicht schon wenn du einfach mal hinter "socket.receive(packet);" mit "printline" ne Zeile ausgeben lässt, wenn diese Zeile nicht mehr angezeigt wird weisst du schon das das Programm (in diesem Fall der Thread) an dieser Stelle anhält ;)
Ah ja, gar nicht so dumm ;-)
Grüße
Andreas
Hi,
Die Methode "socket.receive(packet);" wartet so lange bis eine Antwort vom Server, also ein Packet von diesem wieder ankommt. Weil kein Packet kommt, macht er an dieser Stelle auch nicht weiter.
Um diese Art von Problemen zu umgehen, gibt es seit jdk 1.4.x das NIO package (Stichwort: 'Non-blocking I/O'). Ein Blick darauf könnte sich in Deinem Falle lohnen - Pakete herbeizaubern kann man damit aber sicherlich nicht ;-)Viele Grüße,
Martin Jung
Hallo,
ich denke du meinst "DatagramChannel" da bekommt man wenn none-blocking aktiviert ist, "NULL" als return Wert. Leider bringt mich das im moment auch noch nicht so richtig weiter ...
Hab jetzt mal mit Ethereal den Traffic analythiert. Also das Packet wird aufjedenfall abgesendet, der Server erkennt aber glaub die Information in dem Packet selbst nicht. Liegt dann wahrscheinlich doch an dem String (sendMsg).
Mal ne blöde Frage, aber gibt ein Server eigentlich noch ein response ab, wenn die Anfrage (UDP) Fehlerhaft ist, oder verwirft er das Packet einfach ?
Hi!
Hab jetzt mal mit Ethereal den Traffic analythiert. Also das Packet wird aufjedenfall abgesendet, der Server erkennt aber glaub die Information in dem Packet selbst nicht. Liegt dann wahrscheinlich doch an dem String (sendMsg).
Dann vergleiche das doch mal mit der PERL-Version!
Mal ne blöde Frage, aber gibt ein Server eigentlich noch ein response ab, wenn die Anfrage (UDP) Fehlerhaft ist, oder verwirft er das Packet einfach ?
Das kommt auf den Server an, UDP ist halt ein Vebindungsloses Protokoll, der Client sendet eien Abfrage, der Server lauscht an dem entsprechenden Port, und wenn er was empfängt kann(!) er das analysieren und reagieren. Es gibt keien Verbindung wie bei TCP. Man könnte den Server so programmieren dass er bei einer Fehlerhaften Anfrage eine Fehlermeldung sendet, oder nicht. Ich würde wie gesagt mal mit einem Client wo es funktioniert mit Ethereal lauschen, und die beiden gesendeten Pakete sher genau vergleichen. Bei UDP sollte man auf Alle Fälle noch dieses problem abfangen, es kann immer vorkommen dass einen die Antwort des Servers nicht erreicht, das ist im Genegsatz zu TCP nicht sichergestellt, das ist Dein Problem Dich darum zu kümmern.
Wenn Du nicht weiterkommst kannst Du die aufgezeichneten Pakete ja mal posten(File -> print -> print to -> File)
Grüße
Andreas
Hallo,
ich kann zwar kein Perl (da ich das für eine Krankheit und keine Sprache halte :-)), aber ich nehme mal an dass das
"my $sender="\xE3\x96\x5A\x00\x00\x00";"
der Inhalt ist der gesendet wird. Wenn Perl sich nur halbwegs an Standards hält sind das Hexadezimalzahlen, und
"String sendMsg = "E3965A000000";"
in Java ist dann etwas völlig anderes. Der Server antwortet nicht weil er eine illegale Anfrage bekommt.
Versuch es mal mit:
byte data[] = { (byte)0xE3, (byte)0x96, (byte)0x5A, (byte)0x00, (byte)0x00, (byte)0x00};
und lass den String weg.
Ich bin mir relativ sicher dass es dann klappt.
Ach ja, und einen Socket muss man immer schließen wenn man ihn nicht mehr braucht. Einige Betriebssysteme reagieren allergisch auf viele offene Sockets. Also socket.close(); nach dem send() ...
Dominik
Hallo,
ich kann zwar kein Perl (da ich das für eine Krankheit und keine Sprache halte :-)), aber ich nehme mal an dass das
"my $sender="\xE3\x96\x5A\x00\x00\x00";"
der Inhalt ist der gesendet wird. Wenn Perl sich nur halbwegs an Standards hält sind das Hexadezimalzahlen, und
"String sendMsg = "E3965A000000";"
in Java ist dann etwas völlig anderes. Der Server antwortet nicht weil er eine illegale Anfrage bekommt.
Versuch es mal mit:
byte data[] = { (byte)0xE3, (byte)0x96, (byte)0x5A, (byte)0x00, (byte)0x00, (byte)0x00};
und lass den String weg.
Ich bin mir relativ sicher dass es dann klappt.
Ach ja, und einen Socket muss man immer schließen wenn man ihn nicht mehr braucht. Einige Betriebssysteme reagieren allergisch auf viele offene Sockets. Also socket.close(); nach dem send() ...Dominik
Hi Domi,
danke das posting, das war der Fehler mit dem String. Bei Perl muss ich dir ebenfalls rechtgeben ;)
Mfg Jan