# Client/Server Antwort von Server empfangen



## MarcJ (28. Mrz 2009)

Hallo,

hab da ein kleines Problem mit dem Empfangen der Serverantwort.
Und zwar kann man sich am Server anmelden,bekommt dann auch eine Antwort des Servers.Doch jede weitere Meldung des Servers wird nicht mehr empfangen.

[HIGHLIGHT="Java"]public void setSocket(){
        try{
            // Falls noch keine Verbindung zum Socket besteht wird ein Socket erzeugt            
                sock_send = new Socket( ccg.getIP(), port );         
        }catch(Exception e){
                ccg.setTextArea(e.toString());
        }      
    }


public void receive(){
        try{
            String str;
            sock = new Socket();
            sock = sock_recv.accept();

            while(true){
                ccg.setColor("inwhile");
                in = new DataInputStream(sock.getInputStream());
                while((str = in.readUTF()) != null){
                    ccg.setTextArea(str);
                }
            }

        }catch(Exception e){
            ccg.setTextArea(e.toString());
        }       
    }[/HIGHLIGHT]

beim Anmelden wird einmal start() ausgeführt,wobei sich der Aufruf von receive() in run() befindet.

sieht fast so aus ,als ob receive() nur ausgeführt wird bis einmal was empfangen wurde.Danach scheint der Thread inaktiv zu sein....was mach ich den da für einen Denkfehler ?

Vielleicht kann mir da jemand weiterhelfen,

Gruß
Marc


----------



## MarcJ (28. Mrz 2009)

aus irgendeinem Grund wird meine while(true) Schleife nicht weiter durchlaufen......
accept() wartet einmal auf Verbindung ,die dann auch Zustande kommt,empfängt einen String und dann wars das auch schon. Die müsste doch auf weitere Strings warten,oder?


----------



## musiKk (28. Mrz 2009)

Was auf den ersten Blick etwas seltsam aussieht ist, dass du in jedem Schleifendurchlauf den DataInputStream neu erstellst.

Wird die innere while-Schleife aber überhaupt mal beendet? Ich könnt mir vorstellen, dass es am readUTF() hängt.


----------



## MarcJ (29. Mrz 2009)

wenn er in dieser Schleife hängen würde dann sollte doch sobald etwas neues gesendet wird eine Ausgabe erfolgen oder?


----------



## musiKk (29. Mrz 2009)

Keine Ahnung. Ich habe noch nicht mit DataInputStreams gearbeitet, darum war meine Aussage wahrscheinlich unzutreffend. Ich hab mal ein Beispiel gemacht, das läuft, wie es soll (oder zumindest, wie ich es will):


```
public class JavaForumTest {

	public static void main(String[] args) throws Exception {

		Server server = new Server();
		Thread serverThread = new Thread(server);
		serverThread.start();

		Socket client = new Socket(InetAddress.getLocalHost(), 31337);
		DataOutputStream dos = new DataOutputStream(client.getOutputStream());

		dos.writeUTF("foo");
		dos.writeUTF("bar");

		dos.writeUTF("kthxbye");
		dos.close();

	}
}

class Server implements Runnable {

	private final ServerSocket serverSocket;

	public Server() throws IOException {

		serverSocket = new ServerSocket(31337);

	}

	@Override
	public void run() {

		try {
			Socket s = serverSocket.accept();
			DataInputStream dis = new DataInputStream(s.getInputStream());
			String string = null;
			while (!(string = dis.readUTF()).equals("kthxbye")) {
				System.out.println("received: " + string);
			}
			dis.close();
			s.close();
			serverSocket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

Bei readUTF() auf null zu prüfen ist m. E. zweckfrei, da die Funktion laut Dokumentation kein null zurückliefert.


----------



## MarcJ (30. Mrz 2009)

hmm,also wenn ich im Thread meine while() Schleife debugge,dann sehe ich das diese nur einmal durchlaufen wird.Sendet mein Server dann einen weiteren String ,dann springt mein Debugger nicht mehr in den receive() Thread.Das heisst doch das der gar nicht mehr aktiv ist ,oder?


normal müsste doch da ich run() überschreibe und darin receive() aufrufe durchgehend auf Antworten gewartet werden...



Gruß
Marc


----------



## MarcJ (30. Mrz 2009)

ok ich hab meinen Fehler gefunden.........hab bei jedem senden des Servers einen neuen Socket erzeugt 
vielleicht etwas blöde


----------

