UDP mit Java

Morgi morgi,

ich hab da ein Problem.
Ich möchte einen Test per Java machen ob ein bestimmter UDP Port erreichbar ist.
Hintergrund: Ein Check ob der Teamspeak Server online ist.

Leider funzt TS nur auf UDP ... also fällt der normale Socket aus.

Nun hab ich mir was gebastelt, aber es kommt immer "Teamspeak Server online".
Kann aber nicht sein, denn ich hab auf "localhost" kein TS ;)

Wo ist der Fehler? Ich möchte doch nur per Java testen ob der server erreichbar ist :(

Code:
import java.io.IOException; 
import java.net.*; 
import java.util.*; 
 
class udp_socket 
{ 
  public static void main( String[] args )  
  { 
	try
	{
		InetAddress ia = InetAddress.getByName( "localhost" ); 
		while ( true ) 
		{	 
			String s = new Date().toString(); 
			int port = 8767; //Teamspeak Standart UDP Port
			byte[] raw = s.getBytes(); 
 
			DatagramPacket packet = new DatagramPacket( raw, raw.length, ia, port ); 
			DatagramSocket dSocket = new DatagramSocket(); 
 
			dSocket.send( packet ); 
			Thread.sleep( 1000 );
			System.out.println("Teamspeak Server online");
		}
	}
	catch(Exception e)
	{
		System.out.println("Teamspeak Server nicht erreichbar.");
	}
  } 
}
 
Wie kommst du darauf, dass das reine Senden eines UDP Packets dir Aufschluss darüber gibt ob da ein Server läuft?

Wenn du nen Ball wirfst merkst du doch auch erst, dass da ne Wand ist, wenn der Ball zurück kommt oder? Dh du musst in irgendeiner Weise auf ne Antwort warten.

Wie das bei TS2 funktioniert bzw wie das Protokoll aussieht ... keine Ahnung.
 
Hab´s eher von "Socket" abgeleitet ..
wenn ich da socket.connect() mache ... und KEIN Fehler kommt ... ist der Server online.

Bei UDP und DatagramSocket siehts anders wohl aus.
Also meinste

if(senden + empfang) {
server = online
}

... versuch ich mal ... danke
 
wenn ich mich aber grad nicht ganz täusche (man möge es mir an einem feiertag verzeihen ;)), dann funktioniert das bei normalen sockets, weil die über tcp (ein verbindungsorientiertes protokol) laufen, und es da den 3-wege-handshake gibt. bei udp (ein verbindungsloses protokol) fällt dieser aber weg. somit bräuchtest du, wie schon erwähnt wurde, eine reaktion vom ts-server.
 
UDP ist verbindungslos, die Daten werden außerdem nicht zuverlässig gesendet, dass heißt ein Paket kann irgendwann, nie oder mehrmals ankommen.

Da keine Verbindung aufgebaut wird, musst du also herausfinden, wie du den TS Server dazu bringst dir Daten zu senden.

EDIT: zu spät
 
sooo...

warum einfach wenn es auch umständlich geht ...

Hab das problem anders gelöst.
Jeder Teamspeak Server hat einen TCP Port, auf dem man die einzelnen TS abfragen kann .... 51234

java ruft php auf und liest deren Ausgabe:

Code:
	public String TS_CHECK(String IP,int port)
	{
		String ergebnis="Port_error";
		try 
		{
                       Socket so= new Socket();
                       so.connect(new InetSocketAddress(IP,51234),500);
          
		       so.setSoTimeout(500);          
                       so.close();

			URL url = new URL( "http://xxx.xxx.xxx.xxx/ts_check.php?SERVER=" + IP + "&PORT=" + port);
			Reader is = new InputStreamReader( url.openStream() );
			BufferedReader in = new BufferedReader( is );
			String s = in.readLine();
			s=s.replaceAll(" ","");
			if(s.equalsIgnoreCase("ONLINE"))
			{
			 	ergebnis="ok";	
			}
			else
			{
				System.out.println(s);	
			}
			in.close();
	         
      	} 
      	catch (Exception e) 
      	{
          System.out.println(e);
      	}
		
 		return ergebnis;
	}
 
mach ich doch

Code:
                       Socket so= new Socket();
                       so.connect(new InetSocketAddress(IP,51234),500);
          
		       so.setSoTimeout(500);          
                       so.close();
 
Viele Wege führen nach Rom. Und man kann natürlich auch einfach mal ein paar Schritte in die eine und dann wieder ein paar in die andere Richtung gehen...

Einen von beiden Abschnitten wegzulassen sollte genauso funktionieren (meint wohl auch Serow). Zum Einfangen der Exception zumindest. Für das println natürlich nicht unbedingt...
 
richtig ...
der code ist auch mehr oder weniger der erste entwurf.
das ausgeben der Exception kommt natürlich weg.

Wollte damit nur zeigen dass es so funktioniert. Und das tut es.
Bin ja auch nicht der Java Held... kenne nur ein paar kleine Sachen ;)
 
Zurück
Oben