# Problem mit Netzwerkprogrammierung im Applet!



## Agent_Smith (7. Nov 2008)

Hallo, ich habe seit einigen Tagen einen Netzwerk-Skript programmiert, was den Rechnerstatus auf ON oder OFF überprüft. Dieses befindet sich in der Metohde "status".
Das funktioniert auch einwandfrei. Sobald ich es in einem Applet implementiere funktioniert das nicht richtig und zeigt mir das alle Rechner OFF-line sind. 
Das Applet gibt eine Tabelle aus. Darin befinden sich die Namen der Rechner und mehrere Kreis mit der Farbe Gruen/Rot. 

Ich kämpfe seit Tagen schon damit das es richtig klappt aber es will irgendwie nicht. Ich hoffe ihr könnt mir helfen da ich kein Java-Guru bin^^

Danke im Vorraus 

Hier mein Skript:  


```
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.net.InetAddress;


/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 31.10.2008
  * @author
  */

public class cads extends Applet {
  // Anfang Attribute
  private java.awt.Image image;
  private java.awt.Graphics g;

  public String [] host = {
      "192.168.0.1","192.168.0.2","192.168.0.3","192.168.0.4","192.168.0.5","192.168.0.6","192.168.0.7","192.168.0.8","192.168.0.9"
    };
  public  String [] Name = {
      "Rechner_1", "Rechner_2","Rechner_3","Rechner_4","Rechner_5","Rechner_6","Rechner_7","Rechner_8","Rechner_9"
    };

  // Ende Attribute

  public void init() {
    setSize(300, 400);
    this.image = createImage(300, 400);
    this.g = this.image.getGraphics();
    // Anfang Komponenten
    
    for(int i=10; i<=laenge(); i=i+24){
      g.drawLine(10, i, 290, i);   //horizontal
    }
      g.drawLine(10, 10, 10, laenge()-14);    //vertikal
      g.drawLine(150, 10, 150, laenge()-14);    //vertikal
      g.drawLine(290, 10, 290, laenge()-14);  //vertikal
    int counter=0;
    for(int b=32; b<laenge()-12; b=b+24){
       g.drawString(Name[counter], 33, b);
      counter=counter+1;
    }
    for (int i=0;i<host.length; i=i+1){
      kreis(i);
    }
    // Ende Komponenten
    repaint();
  }
  // Anfang Methoden
  
   public void paint(java.awt.Graphics graphics) {
    graphics.drawImage(image, 0, 0, this);
  }
  
  public int laenge(){                // hoehe der tabelle
    return (Name.length+1)*24;
  }

  public void kreis(int abstand){
    int abstand_kreis=(abstand*24)+12;
    if (status(abstand)=="true"){
      kreis_gruen();
    } else {
      kreis_rot();
    }
    g.fillOval(210, abstand_kreis, 20, 20); // Rumpf
    g.setColor(new Color(0, 0, 0)); // schwarz
    g.drawOval(210, abstand_kreis, 20, 20); // Rand vom Rumpf
  }
  
  public void kreis_rot(){
    g.setColor(new Color(200, 0, 0)); // rot
  }
  
  public void kreis_gruen(){
    g.setColor(new Color(0, 200, 0)); // gruen
  }
  
  public String status(int zaehler){
      String Status;
      try{
        if (InetAddress.getByName(host[zaehler]).isReachable(10000)) {
          //System.out.println(Name[zaehler] + " is reachable...");
          Status="true";
        } else {
            //System.out.println(Name[zaehler] + " is not reachable...");
            Status="false";
        }
      } catch (Exception e){
          //System.out.println(Name[zaehler]+" existiert nciht");
          Status="false";
        }
    return Status;
  }
  // Ende Methoden
}
```


----------



## Verjigorm (7. Nov 2008)

Ohne mir den Code genau anzuschauen:

Zum Thema isReachable() gibts hier im Forum einen guten Thread
Diese Methode ist nicht so zu gebrauchen, wie man vielleicht denkt, die Methode simuliert KEINEN wirklichen PING-Befehl, wie es erscheinen lässt

Edit: http://www.java-forum.org/de/viewtopic.php?t=47888&highlight=isreachable


----------



## Agent_Smith (7. Nov 2008)

vielen dank für die nette und schnelle antwort :roll: 
ich werde mir das in ruhe durchlesen.


----------



## tuxedo (7. Nov 2008)

Ja, der Thread stammt von mir. Den Codeschnipsel den du da findet, kannst du einfach so übernehmen. Allerdings solltest du sicherstellen, dass der zu testende Rechner, wenn er denn erreichbar ist, auch einen spezifizierten Port offen hat. Da ich nur Geräte zu testen hatte, die ein Webinterface anbieten, war für mich Port 80 ideal.
Wenns um Windows-Rechner geht: Dort sollte eigentlich Port 7 erreichbar sein, wenn nicht irgend etwas (Firewall oder so) dazwischenfunkt.

Nebenbei solltest du beachten, dass beim öffnen von Socketverbindungen in Applets besondere Regeln gelten. AFAIK kannst du nur zu der Maschine eine Socketverbindung aufbauen, von der du das Applet geladen hast. Willst du zu anderen Maschinen kontakt aufnehmen, wirst du das Applet signieren müssen um nicht in eine SecurityException oder so zu laufen.

Zum Signieren gibts glaub in der Foren-FAQ weitere Details.
Im Zweifelsfall hilft auch google weiter.

Gruß
Alex


----------



## Agent_Smith (7. Nov 2008)

Ich vermute das mein Hauptsächliches Problem das signieren eines Applets sein wird. 
Also habe ich den Rat von L-ectron-X im FAQ gefolgt und eine Batch Datei erstellt.
Beim Asuführen werde ich nach einem KEYSTORE-PASSWORt abgefragt. 
Wisst ihr wie das Passwort lautet? oder kann ich das selber herausfinden?


----------



## Verjigorm (7. Nov 2008)

Beim erstenmal musst du eins eingeben (und merken)
Danach ist es in einer Datei gespeichert, irgendwo im userprofil.
Falls man es vergisst, kann man die datei gefahrlos löschen und dann ein neues Passwort angeben.

Genaueres über Forensuche oder Google


----------



## Agent_Smith (7. Nov 2008)

nach dem ich die Batch-Datei ausgeführt habe und 5 passwörter eingegeben habe zeigt er mir eine Fehlermeldung an.
>>jar is unsigned. <signatur missing or no parsable>
woran kann das liegen?


----------



## L-ectron-X (8. Nov 2008)

Das kann viele Ursachen haben. Tippfehler bspw. Du musst immer das gleiche Passwort eingeben. Lösche die .keystore-Datei aus deinem Benutzerverzeichnis und versuche es erneut mit einem anderen Passwort. (Du kannst dir nach Löschen der Datei ein neues selbst ausdenken.)


----------



## Agent_Smith (10. Nov 2008)

in der "MeinJar.jar" befindet sich meine class Datei nicht. 
in welchen Ordner muss sich die class- Datei befindet damit die Batch-Datei diese einbinden kann?


----------



## L-ectron-X (10. Nov 2008)

In deinem Fall (wenn du keine Packages deklariert hast) müssen sich deine .class-Datei und die Batchdatei im gleichen Ordner befinden.
Achte auf Groß-/Kleinschreibung. Wenn du mehrere Klassen hast, kannst du die auch mit *.class angeben.


----------



## Agent_Smith (11. Nov 2008)

ja vielen Dank für eure Hilfe.


----------

