# .readLine() blockt?



## Guest (12. Feb 2009)

Hmm.. ich bin mir nicht sicher ob mein Problem ueberhaupt irgendetwas mit dem Server/Client zu tun hat oder ob ich es einfach nur nicht auf die Reihe bekomme IO anzuwenden. Ich poste einfach mal den ganzen Quellcode der Fehlerklasse:


```
import java.net.*;
import java.io.*;

import javax.swing.SwingUtilities;

public class GoNet extends Thread {
	
	private Go game;
	private ServerSocket server;
	private Socket client;
	private PrintWriter out;
	private BufferedReader in;
	
	private boolean isHost;
	public String hostip, sendThis="";
	public int port, status = 0;
	public static final int DISCONNECTED = 0, CONNECTING = 1, CONNECTED = 2;		
	
	public GoNet(boolean isHost, String hostip, int port, Go game) {
		this.isHost = isHost;
		this.hostip = hostip;
		this.port = port;
		this.game = game;
		status = CONNECTING;
		start();
	}	
	
	public void send(String sendThis) {
		this.sendThis = sendThis;
	}
	
	public void run() {
		runnetwork:
		while(true) {
			try{
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				new MessageWindow("Error", "Die Verbindung wurde unterbrochen.");
				break runnetwork;
			}
			switch(status) {
			case CONNECTING:
				try {
					if(isHost) {
						server = new ServerSocket(port);
						client = server.accept();
					} else {
					client = new Socket(hostip, port);
					}	
					in = new BufferedReader(new InputStreamReader(client.getInputStream()));
					out = new PrintWriter(client.getOutputStream());
					status=CONNECTED;
					new MessageWindow("Verbindung", "Verbingung erfolgreich hergestellt.");
				} catch (IOException e) {
					new MessageWindow("Error", "Verbingung fehlgeschlagen.");
					break runnetwork;
				}	
			break;	
			case CONNECTED:
				if(sendThis.length()>0) {
					out.write(sendThis);
					out.flush();
					sendThis = "";
				}	
				try{
					if(in.ready()) {
						String callMethod = in.readLine();
						game.clientAction(callMethod);
					}
				} catch (IOException e) {
					new MessageWindow("Error", "Die Verbindung wurde unterbrochen.");
					break runnetwork;
				}
			break;
			case DISCONNECTED:
				new MessageWindow("Verbindung", "Verbindung beendet.");
				break runnetwork;
			}
				
		}
		status=DISCONNECTED;
		try {
			if(isHost){
				server.close();				
			}
			client.close();
			in.close();
			out.close();
		} catch (IOException e) {}
	}

}
```

Also das Verbinden funktioniert ohne Probleme. Folgendes Problem besteht:
Eine andere Klasse ruft die Methode send() hier auf, in die ein zu sendender String uebergeben wird. Das senden in Zeile 60-64 scheint auch zu funktionieren. Beim Empfaenger blockt aber scheinbar das readLine() in Zeile 67 einfach den Programmablauf. Bei in.ready() kommt noch true raus, aber bei readLine() passiert aufeinmal nichts mehr. 
Ich habe keine Ahnung woran das jetzt liegen koennte, bin auch ziemlich neu in Java bzw. Programmierung ueberhaupt.
Wenn ready() true ausgibt, dann heißt das doch, dass im Stream was angekommen ist und auch bereit ist ausgelesen zu werden, oder? Warum geht dann readLine() nicht? Bitte um Hilfe!


----------



## Chumax (12. Feb 2009)

readline wartet bis etwas ankommt wahrscheinlich klappt das senden nicht.


----------



## Guest (12. Feb 2009)

Hmm.. jetzt funktioniert es, der Fehler war in einer anderen Klasse <<
Hab wohl irgendetwas falsch gemacht bei der Fehlersuche mit System.out
Naja, hoffe das hat jetzt keinen unnoetig verwirrt, trotzdem danke fuer die Hilfe.


----------



## tuxedo (12. Feb 2009)

Oftmals liegt es daran, dass zu wenig Daten gesendet werden und diese noch im Sende-Puffer hängen und auf mehr Daten warten damit es sich das Senden auch lohnt.

Ein "flush()" auf den Ausganestrom hilft dann in der Regel.

- Alex


----------

