Udpclient und udpserver

hi leute,

ich hab folgendes problem:

ich habe udpclient und udpserver geschrieben.

die daten werden mit hilfe von sockets transportiert.

der client liefert dem server die werte, jetzt sollen die werte vom server wieder zurück gegeben werden und beim client angezeigt werden.

ich gebe also zb. name, vorname, land ein

die daten werden über vector addiert.

siehe ein und aus:


String ein(String name, String land, String jahr){
person te;
te = new persond();
te.setzedaten(name, land, jahr);
tn.add(te);
return (te.toString());
}

String aus(){
return (tn.toString());


diese beide methoden sind in der classe server.

jetzt will ich dass mir alle personen bei dem client angezeigt werden.

(ich werde jetzt nciht den ganze code posten, weil da nciht das problem ist)

wie ich von verschiedenen beispielen gesehen habe, sollen die daten so angezeigt werden: (beim UDPClient)




aSocket.receive (reply);
System.out.println(" Antwort: " + new String(reply.getData()));


bei der eingabe der daten kriege ich folgede ausgabe am client:
Thread[Thread-0,5,main]

nach jeder weiteren eingabe wird die erste zahl (hier die 0) um eins erhöht.

d.h. im Thread[Thread-x,5,main] sind meine daten - nur die werden falsch angezeigt

was muss ich ändern? sollen meine methoden ein und aus anders geschrieben werden, und sollen die empfangenen daten anders ausgelesen werden?

hmm, ich gebe mal den ganzen code ein, vielleicht bringt es einen weiter

klasse client:

import java.net.*;
import java.io.*;
import java.lang.*;

public class UDPClient {
public static void main( String args[]){
// args[0]: Funktionsnummer
// args[1]: Name des Servers

if (args.length ");
System.exit(-1);
}
try {

System.out.println(" Nachricht: " + args[0]);

DatagramSocket aSocket = new DatagramSocket();
byte [] m = args[0].getBytes();
String s="";
String a="";
String b="";
Message message = new Message("","","","");

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));//Puffert die daten im zwspeicher
if (m[0]==‚1‘){
try {
System.out.print(„Funktionsparameter eingeben:“);
s = in.readLine(); //stellt bufferedreader zur verfügung
message=new Message(„ein“, s, a, b);
}
catch (IOException e)
{
System.out.println(„Fehler bei der Eingabe einer Zeile“);
System.exit( 1 );
}
}
else{
message=new Message(„aus“, s);
}

ByteArrayOutputStream baos=new ByteArrayOutputStream(); //Bytezugriffe auf ein Array

ObjectOutputStream oos=new ObjectOutputStream(baos);

oos.writeObject(message);
System.out.println(„Schreibe Objekt!!!“);
oos.close();

byte [] ba = baos.toByteArray(); //Inhalt des Array aufrufen - ba: bytepuffer

InetAddress aHost = InetAddress.getByName(args[1]); //ip-adresse übergeben
int serverPort = 6789;
DatagramPacket request = new DatagramPacket (ba, ba.length,
aHost, serverPort);

aSocket.send (request);

byte[] buffer = new byte[1000];
DatagramPacket reply = new DatagramPacket(buffer, buffer.length);

aSocket.receive (reply);

String str = new String(reply.getData());

System.out.println(" Antwort : " + str);

aSocket.close();
}catch (SocketException e){ System.out.println(" Socket: " + e.getMessage());
}catch (IOException e){ System.out.println(" IO: " + e.getMessage());}
}
}

//Class Message
class Message implements Serializable{
//Name of called function
public String a="";
public String b="";
public String c="";
public String d="";

Message(String a, String b, String c, String d){
this.a=a;
this.b=b;
this.c=c;
this.d=d;
}

Message(String a, String b){
this.a=a;
this.b=b;
}
}

klasse server:

import java.net.*;
import java.io.*;
import java.lang.*;
import java.util.*;
import java.util.Vector;

public class UDPServer{
public static void main( String args[]){

Server s=new Server();

} // main

} //class UDPServer

class Server{

protected String Name;
protected String Land;
protected String Thema;

Vector tn = new Vector();

Server(){

System.out.println(„Der Server ist gestartet“);
String result="";
try{
DatagramSocket aSocket = new DatagramSocket (6789);
byte[] buffer = new byte[1000];
while(true){
DatagramPacket request = new DatagramPacket (buffer, buffer.length); //übergabe Byte-Puffer, größe
aSocket.receive (request);

//System.out.println(" Request: " + new String(request.getData(), 0, request.getLength()));
ByteArrayInputStream bais=new ByteArrayInputStream(request.getData(),0,request.getLength());
ObjectInputStream ois=new ObjectInputStream(bais);
Message m=(Message)ois.readObject();

System.out.println(„Aufgerufene Funktion:“+m.a);
System.out.println(„Parameter:“+m.b);
if (m.a.equals(„ein“)){
result=this.ein(Name, Land, Thema);
}else{
result=this.aus();
}

DatagramPacket reply = new DatagramPacket (result.getBytes(),
result.getBytes().length, request.getAddress(), request.getPort());
aSocket.send (reply);
}
}catch (SocketException e){ System.out.println(" Socket: " + e.getMessage());
}catch (ClassNotFoundException e){System.out.println(" ClassNotFound: " + e.getMessage());
}catch (IOException e) {System.out.println(" IO: " + e.getMessage());}
}

String ein(String name, String land, String vortrag){
Teilnehmer te;
te = new Teilnehmer();
te.setzedaten(name, land, vortrag);
tn.add(te);
return (te.toString());
}

String aus(){

return (tn.toString());

}
}

zuerst sollte der server über dos konsole gestartet werden.

eingabe bei updclient: java UDPClient 1 localhost
nach kommt die frage nach dateeingabe.

wenn man java UDPClient IRGENDWAS localhost eingibt, müssten alle daten angezeit werden

Hallo,

protected String Name;
protected String Land;
protected String Thema;
// ...

 if (m.a.equals("ein"))
 {
 result=this.ein(Name, Land, Thema);
 }
 else
 {
 result=this.aus();
 }

Name, Land und Thema werden nie initialisiert, sind also null, ist das dein Problem?

Gruß
Heavy

Hi,
oja

Hallo,

protected String Name;
protected String Land;
protected String Thema;
// …

habe jetzt weggemacht

if (m.a.equals(„ein“))
{
result=this.ein(Name, Land, Thema);
}
else
{
result=this.aus();

und es entsprechend umgeändert

if (m.a.equals(„ein“)){
result=this.ein(m.b, m.c, m.d);
}else{
result=this.aus();

}

Name, Land und Thema werden nie initialisiert, sind also null,
ist das dein Problem?

Gruß
Heavy

trozdem bekomme ich so eine komische ausgabe.

trozdem bekomme ich so eine komische ausgabe.

Kannst du das etwas näher spezifizieren?

Die Ausgabe hängt von der Klasse Teilnehmer ab, da du entweder direkt deren toString() Output zurückgibst, oder den kompletten Vector mittels toString() (Was dann wiederum einer durch Komma getrennte Liste der einzelnen Teilnehmer Objekte entspricht).

Wie sieht die toString() Methode deiner Klasse aus?

Gruß
Heavy

toString() gibt es in Java, ist also nicht meine methode.
(vielleicht müsste ich auch was anderes benutzten damit es läuft)

also, wenn ich 1 datensatz eingeben habe kommt sowas
[Thread[Thread-0,5,main] als anwort beim client

bei 2 daten und ausgabe alle sätze : [Thread[Thread-0,5,main], Thread[Thread-1,5,main]]

also die werden nach komma weiter so angezeigt
ich denke problem ist mit vector…?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

toString() gibt es in Java, ist also nicht meine methode.

richtig, aber wenn die nicht überschrieben wird gibt sie lediglich

getClass().getName() + '@' + Integer.toHexString(hashCode())

aus, meist nicht allzu hilfreich (siehe http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Ob…)

also, wenn ich 1 datensatz eingeben habe kommt sowas
[Thread[Thread-0,5,main] als anwort beim client

bei 2 daten und ausgabe alle sätze : [Thread[Thread-0,5,main],
Thread[Thread-1,5,main]]

Welche Ausgabe erwartest du denn? Den Code der Klasse die du dem Vector übergibst ist nach wie vor unbekannt, genau darauf kommt es aber an.

Gruß
Heavy

ich denke es bringt nichts toString() zu überarbeiten - zumindest weiß ich nicht was.

ich denke der übergebene vector muss beim client dann irgendwie die daten verarbeiten und richtig anzeigen (also mann muss beim client sorgen, dass die richtig angezeigt werden) - was meint ihr?

ich bin jetzt doch am toString überarbeiten

(ich habe bei teilnehmer extends Thread weggemacht jetzt kommt als wert immer Teilnehmer@18a7efd raus)

wenn ich zb. als test

public String toString() {
return (Integer.toHexString(hashCode()));
}

eingebe, gibt es keine veränderungen - als wird es nciht akzeptiert …?

wenn ich irgendwas mit
public void toString() {

}

mache kommt folgendes:

toString() in Server cannot override toString() in java.lang.Object; attempting to use incompatible return type

found : void

required: java.lang.String

(ich habe bei teilnehmer extends Thread weggemacht jetzt kommt
als wert immer Teilnehmer@18a7efd raus)

das ist die default Implementierung in java.lang.Object die ich erwähnt hatte

public String toString() {
 return (Integer.toHexString(hashCode()));
}

eingebe, gibt es keine veränderungen - als wird es nciht
akzeptiert …?

fällt da nicht das Teilnehmer@ weg?

wenn ich irgendwas mit
public void toString() {

}

nein, die Methode muss schon einen String zurückgeben. Du übergibst den Teilnehmer Objekten ja Land, Name etc., ich würde die Methode dann in etwa so implementieren (abhängig von deinen Objektvariablen):

public String toString()
{
 return "Teilnehmer[" + name + ", " + land + ", " + vortrag + "]";
}

Gruß
Heavy