String mit UDP senden

Status
Nicht offen für weitere Antworten.

hawkeye78

Bekanntes Mitglied
Hallo,

ich würde gerne ein Programm schreiben mit dem ich per Wake on LAN einen meiner Rechner starten kann, ich habe die Maske und die Valitätsprüfung für die Eingabe soweit zusammen, aber nun stehe ich vor dem Problem die Daten per UDP zu senden, ich habe nach der Anleitung aus Java ist auch eine Insel folgenden Quellcode zusammen gebastelt, aber irgendwie will der nicht so wie ich:

Code:
	public void wakeUp(String sMAC, String sIP)
	{
		String send="FFFFFFFFFFFF";
		String tmp="";
		// Zerlegen der MAC-Adresse anhand des Trennzeichens (-)
		StringTokenizer tokenizer = new StringTokenizer(sMAC,"-");
		
		while(tokenizer.hasMoreTokens())
		{
			tmp=tmp+tokenizer.nextToken();
		}
		
		// 16faches anfügen der MAC-Adresse
		for(int i=0; i<16; i++)
		{
			send=send+tmp;
		}
		
		System.out.println(send);

		InetAddress IP=InetAddress.getByName(sIP);
		
	    DatagramPacket packet = new DatagramPacket(send, send.length(), IP, 4711);
	    DatagramSocket dSocket = new DatagramSocket();
	    dSocket.send( packet );	
	}

Im Moment bekomme ich die Fehlermeldung "The Constructor DataPacket(String, int, InetAddress, int) is undefined" ich hatte nach einem Hinweis aus dem Chat noch einmal in die API geschaut in der Steht das er für das Senden der Daten keinen String sondern eher eine Bytevariable erwartet. Aber wenn ich versuche von String nach Byte zu casten bekomme ich die Fehlermeldung das es nicht möglich ist. Daher bin ich im moment ziemlich ratlos und wäre über einen entsprechenden Hinweis auf jeden Fall sehr dankbar.
Viele Grüsse
Dan
 
Hallo Raoul,

vielen dank für deine Hilfe, ich hatte bei meinem Lösungsansatz ein paar kleinigkeiten vergessen (z.B. den Socket für die eigentlich verbindung), nun gehen die Daten zumindestens raus (zumindestens behauptet das meine Firewall. Allerdings stehe ich nun vor dem Problem das der Zielrechner trotz der gesendeten Datenstumm bleibt. Mein Quellcode sieht nach der Änderung wie folgt aus:

Code:
	public void wakeUp(String sMAC, String sIP)
	{
		String send="FFFFFFFFFFFF";
		String tmp="";
		// Zerlegen der MAC-Adresse anhand des Trennzeichens (-)
		StringTokenizer tokenizer = new StringTokenizer(sMAC,"-");
		
		while(tokenizer.hasMoreTokens())
		{
			tmp=tmp+tokenizer.nextToken();
		}
		
		// 16faches anfügen der MAC-Adresse
		for(int i=0; i<16; i++)
		{
			send=send+tmp;
		}
		
		System.out.println(send);

		byte[] buf = new byte[256];
		buf=send.getBytes(); 
		InetAddress address=null;
		try
		{
			address = InetAddress.getByName("192.168.1.255");
		}
		catch(UnknownHostException io)
		{}
		
		DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 9);
		
		DatagramSocket verbindung=null;
		try
		{
			verbindung=new DatagramSocket(9);
		}
		catch(IOException io)
		{}
			
		try
		{
			verbindung.send(packet); 
		}
		catch(IOException io)
		{}

	}

Ich wäre über einen entsprechenden Hinweis auf jeden Fall sehr dankbar da eigentlich aus der Doku nur hervorgeht das ich auf Port 9, ein Paket mit dem Aufbau 1 Mal die Mac-Adresse und 16 Mal die Zeichenfolge FFFFFFFFFF senden muß.
Viele Grüsse
Dan
 
Hallo Raoul,

vielen Dank für den Hinweis, ich bin gerade bei der Suche hier im Forum über einen Beitrag gestolpert der wohl mein Problem ebenfalls lösen könnte, allerdings wird in diesem Vorgeschlagen die Klasse ethernetAddress einzubinden, vielleicht hast du oder jemand anders der das liest eine Idee woher ich diese Klasse nehme kann?
Vielleicht bin ich noch nicht ganz wach, aber irgendwie habe ich es nicth geschafft auf den von dir vorgeschlagenen Link zu kommen
Viele Grüsse
Dan
 
Steht doch da in dem Artikel wie man die Klasse benutzt:

Code:
   public static void main(String[] Args) throws IllegalEthernetAddressException, IOException {
      String MAC = "AA:BB:CC:DD:EE:FF";
      InetAddress host = InetAddress.getByName("MeinPCName"); //liefert lok. Namen und IP
      int port = 9;
      EthernetAddress[] NIC = {new EthernetAddress(MAC)};
      wakeup(NIC, host, port);

   }

Die Klasse wird wohl in java.net sein, viel anderes importiert der da ja nicht.
 
also ich habe das jetzt so probiert:

Code:
import java.io.*;
import java.net.*;
import java.util.*;

public class wol
{
	public static void main(String[] args)
	throws IllegalEthernetAddressException
	{
		//..
		
	}
}

Aber das liefert als Fehlermeldung IllegalEthernetAddressException cannot be resolved to a type
 
Kannst du mal bitte den ganzen Code posten der die Exception wirft?

Ich hab jetzt mal selbst rumprobiert, ich finde die Klasse EthernetAdress aber nirgendwo. Aber die brauchst du auch eigentlich nicht wirklich, warum erzeugst du nicht einfach einen Byte Array mit der MAC Adresse und benutzt das?
 
ich habe nach ein bißchen herumfragen im Chat heraus gefunden, das es offenbar ein Paket (oder wie auch immer man das bezeichnen möchte) von Steffen Moldaner gibt das man zunächst einbinden muß bevor man auf die entsprechenden Methoden zugreifen kann.
Ich hatte darauf hin mal das programm aus diesem Beitrag kopiert
Code:
import java.io.*;
import java.net.*;
import java.util.*;

public class wol {
   
   public static void main(String[] Args) throws IllegalEthernetAddressException, IOException {
      String MAC = "AA:BB:CC:DD:EE:FF";
      InetAddress host = InetAddress.getByName("MeinPCName"); //liefert lok. Namen und IP
      int port = 9;
      EthernetAddress[] NIC = {new EthernetAddress(MAC)};
      wakeup(NIC, host, port);

   }
   
   public static void wakeup(EthernetAddress[] ethernetAddresses, InetAddress host, int port) throws IOException {
      DatagramSocket socket = new DatagramSocket();
      
      for (int i = 0; i < ethernetAddresses.length; i++) {
         byte[] wakeupFrame = createWakeupFrame(ethernetAddresses[i]);
         
         DatagramPacket packet = new DatagramPacket(wakeupFrame, wakeupFrame.length, host, port);
         
         socket.send(packet);
      }
   }
   
   protected static byte[] createWakeupFrame(EthernetAddress ethernetAddress) {
      byte[] ethernetAddressBytes = ethernetAddress.toBytes();
      byte[] wakeupFrame = new byte[6 + 16 * ethernetAddressBytes.length];
      
      Arrays.fill(wakeupFrame, 0, 6, (byte)0xFF);
       
      for (int j = 6; j < wakeupFrame.length; j += ethernetAddressBytes.length) {
         System.arraycopy(ethernetAddressBytes, 0, wakeupFrame, j, ethernetAddressBytes.length);
      }
      
      return wakeupFrame;
   }
}

und auch zum laufen gebracht, allerdings wird im moment der Rechner noch nicht gestartet. Ansonsten möchte ich mich schon einmal für deine Ausführliche Hilfe bedanken
viele Grüsse
Dan

EDIT:
Ich habe den Fehler gefunden warum es nicht funktioniert, ich hatte bei MAC die falsche Mac-Adresse angegeben, nachdem ich diese korregiert habe ging es....
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben