Socket, args

bizkit

Mitglied
Hallo,
ich habe ein folgendes Problem und ich kann es leider nicht lösen.

Ich habe ein Programm dass mir meine eigenen Daten von meinem Rechner ausgeben soll.
Nur leider funktioniert es auch nicht. Auch ähnliche Programme mit Sockets (Server und Clients) haben die gleiche Fehlermeldung. Meine Vermutung ist, dass es an ,,args" liegen könnte.
Nur leider kenne ich mich damit überhaupt nicht aus.

1.Fehler: Ich wollte mal das ,,args" auslesen mit: for(int i = 0; i <= args.length; i++){
String arg = args;


Dabei bekomme ich die Fehlermeldung:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at start.main(start.java:7)


2.Fehler (Hauptproblem): Das ist eingentlich kein richtiger Fehler, aber das Programm endet nach dem erste Block. Es sollte mir aber die Daten ausgeben




Könnte mir einer helfen den Fehler zu beheben.
Hier ist der Quellcode:

Java:
import java.net.*;
 
public class Clientsocket1
{
  public static void main(String args[])
  {
    // Prüft, ob die Parametrisierung des Aufrufs korrekt
  if (args.length != 1) {
      System.err.println("Ziel: " + args[0]); 
    System.err.println("Argument-Länge " + args.length + " Usage: java clientsocket1 <host>");
    System.exit(1);
  }
  try {
    //Holt den ersten Parameter (d.h. den Namen des Hosts mit dem eine Verbindung
    // aufgenommen werden soll aus dem Programmaufruf
    // getByName ist eine Static methode, die ein Objekt der Klasse InetAddress zurückliefert 
    InetAddress addr = InetAddress.getByName(args[0]);
    System.out.println(addr);    
    // Jetzt werden Hostname und Hostadresse ausgegeben
    System.out.println(addr.getHostName());
    System.out.println(addr.getHostAddress());
    
    System.out.println("lokaler host: " + addr.getLocalHost());   // Lokaler Hostname 
  } catch (UnknownHostException e) 
  {
    // wird ausgeworfen wenn der Host nicht identifizierbar ist
    System.err.println(e.getMessage());
    System.exit(1);
  }
  }
}
 
ohne jetzt noch weiter den Code zu lesen:
Code:
for(int i = 0; i <= args.length; i++)
Kann nicht klappen, da muss
Code:
for(int i = 0; i < args.length; i++)
hin 🙂

ok noch weiter gelesen
Java:
if (args.length != 1) {
    System.err.println("Ziel: " + args[0]); 
    System.err.println("Argument-Länge " + args.length + " Usage: java clientsocket1 <host>");
    System.exit(1);
}

Das kann auch nicht klappen, denn wenn
Code:
args.length == 0
ist, dann geht er da rein, und versucht aber auch ein Argument auszulesen
Code:
args[0]
, was nicht existiert. Daher dein Fehler mit der AIOOBE
 
Zuletzt bearbeitet:
damit die Fehlermeldung nicht kommt. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Clientsocket1.main(Clientsocket1.java:9)


Das Programm sollte mir meinen hostName und hostAddress ausgeben.
 
ist der Aufruf dann:
Code:
java Clientsocket1 <name> <adresse>
??

Java:
if (args.length != 2) {
    //Fehlermeldungen
} else {
     System.err.println("Name: " + args[0]); 
     System.err.println("Adresse: " + args[1]); 
}
 
was genau meinst du jetzt?

Ich habe das Programm mit deinem Code ergänzt, aber es kommt immer noch die selbe Fehlermeldung


So sollt eigentlich die Ausgabe sein, aber mit meinen Werten:
QBBD9

Kostenlos Bilder hochladen | img4web.com
 
Zuletzt bearbeitet:
Java:
import java.net.*;
 
public class Clientsocket1
{
  public static void main(String args[])
  {
    // Prüft, ob die Parametrisierung des Aufrufs korrekt
	  if (args.length != 2) {		    //Fehlermeldungen
		} else {
		     System.err.println("Name: " + args[0]); 
		     System.err.println("Adresse: " + args[1]); 
	}	
	
  try {
    //Holt den ersten Parameter (d.h. den Namen des Hosts mit dem eine Verbindung
    // aufgenommen werden soll aus dem Programmaufruf
    // getByName ist eine Static methode, die ein Objekt der Klasse InetAddress zurückliefert 
    InetAddress addr = InetAddress.getByName(args[0]);
    System.out.println(addr);    
    // Jetzt werden Hostname und Hostadresse ausgegeben
    System.out.println(addr.getHostName());
    System.out.println(addr.getHostAddress());
    
    System.out.println("lokaler host: " + addr.getLocalHost());   // Lokaler Hostname 
  } catch (UnknownHostException e) 
  {
    // wird ausgeworfen wenn der Host nicht identifizierbar ist
    System.err.println(e.getMessage());
    System.exit(1);
  }
  }
}
 
Java:
import java.net.*;

public class Clientsocket1 {
    
    public static void main(String args[]) {
        // Prüft, ob die Parametrisierung des Aufrufs korrekt
        if (args.length != 1) {
            System.out.println("FEHLER");
            System.exit(0);
        } else {
            try {
                //Holt den ersten Parameter (d.h. den Namen des Hosts mit dem eine Verbindung
                // aufgenommen werden soll aus dem Programmaufruf
                // getByName ist eine Static methode, die ein Objekt der Klasse InetAddress zurückliefert 
                InetAddress addr = InetAddress.getByName(args[0]);
                System.out.println(addr);    
                // Jetzt werden Hostname und Hostadresse ausgegeben
                System.out.println(addr.getHostName());
                System.out.println(addr.getHostAddress());
    
                System.out.println("lokaler host: " + addr.getLocalHost());   // Lokaler Hostname 
            } catch (UnknownHostException e) {
                // wird ausgeworfen wenn der Host nicht identifizierbar ist
                System.err.println(e.getMessage());
                System.exit(1);
            }     
        }
    }
}

machst es so, oben hätte bei //Fehlermeldung der System.exit(0) Befehl hingemusst, den du ja schon ganz zu Beginn drin hattest. So klappt es nun
 
Ok, die Fehlermeldung ist jetzt weg,

aber wie komme ich in den 2 Block, also das der mir mein HostName und Address ausgibt?


Ich habe jetzt das Programm selber verändert indem ich ein neues Array-String erstellt habe.
dann läuft das Programm auch richtig.

Aber wieso klappt es nicht mit args???



hier ist meine aktueller code:
Java:
import java.net.*;


public class Clientsocket1 {
    
    public static void main(String args[]) {
        // Prüft, ob die Parametrisierung des Aufrufs korrekt
      
    [B]String ip [] = new String [1];[/B]
    	
    	
    	if (ip.length != 1) {
            System.out.println("FEHLER");
            System.exit(0);
        } else {
           
        	
        	try {
                //Holt den ersten Parameter (d.h. den Namen des Hosts mit dem eine Verbindung
                // aufgenommen werden soll aus dem Programmaufruf
                // getByName ist eine Static methode, die ein Objekt der Klasse InetAddress zurückliefert 
                InetAddress addr = InetAddress.getByName(ip[0]);
                System.out.println(addr);    
                // Jetzt werden Hostname und Hostadresse ausgegeben
                System.out.println(addr.getHostName());
                System.out.println(addr.getHostAddress());
    
                System.out.println("lokaler host: " + addr.getLocalHost());   // Lokaler Hostname 
            } catch (UnknownHostException e) {
                // wird ausgeworfen wenn der Host nicht identifizierbar ist
                System.err.println(e.getMessage());
                System.exit(1);
            }     
        }
    }
}
 
Zuletzt bearbeitet:
er gibt doch nun alles aus!? Zumindest macht er das bei mir.

Code:
java Clientsocket1 www.gmx.de
www.gmx.de/213.165.64.74
www.gmx.de
213.165.64.74
lokaler host: ....
 
Zuletzt bearbeitet:
ne bei mir hat es mit ,,args" nicht ausgegeben (nur halt den Fehler)
aber als ich ein anderes array erstellt habe (siehe Beitrag oben)
dann hat es geklappt.

Aber warum klappt es nicht mit args?

Du hast mir schon weitergeholt(DANKE), aber ich würde gerne trotzdem gerne wissen wieso es nicht mit args läuft
 
mit oder ohne Parameter bei Programmstart? Sprich wie übergibst du den Hostnamen oder die Adresse beim Testen? Das kannst in den Run Configurations angeben als Argument .. dann klappts auch mit args 🙂
 
was für parameter muss ich dem übergeben???

ich kenne das mit den parameter von classen oder methoden die ich in dem programmcode übergebe, aber so im eclipse weiss ich nicht, was ich für parameter überegen sollte.
 
ohne jetzt noch weiter den Code zu lesen:
Code:
for(int i = 0; i <= args.length; i++)
Kann nicht klappen, da muss
Code:
for(int i = 0; i < args.length; i++)
hin 🙂

ok noch weiter gelesen
Java:
if (args.length != 1) {
    System.err.println("Ziel: " + args[0]); 
    System.err.println("Argument-Länge " + args.length + " Usage: java clientsocket1 <host>");
    System.exit(1);
}

Das kann auch nicht klappen, denn wenn
Code:
args.length == 0
ist, dann geht er da rein, und versucht aber auch ein Argument auszulesen
Code:
args[0]
, was nicht existiert. Daher dein Fehler mit der AIOOBE

aber selbstversuch haste gemacht oder ?
wenn args.length==0 dann ist args.length!=1 doch erfüllt ...

mit dem for hast du aber rechte
 
Habe ich nicht, stimmt .. du aber auch nicht, denn wenn
Code:
args.length == 0
ist existiert auch kein args[0] und er bekommt eine ArrayIndexOutOfBounds für Index 0 :bae:
 

Neue Themen


Zurück
Oben