# read() und write()



## ninili (19. Okt 2007)

Hallo,

ich arbeite gerade an einem kleinen Time-Service der über eine Socket-Verbindung je nach Eingabe die Zeit oder das Datum ausgibt. Leider funktionieren die Befehle read() und write() nicht. Kann mir vielleicht jemand weiterhelfen?


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

public class TimeService {

	public static void main(String[] args) throws IOException {
		
		ServerSocket server = new ServerSocket(1024);

		while (true) {
			Socket client = null;

			try {
				client = server.accept();
				handleConnection(client);
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (client != null)
					try {
						client.close();
					} catch (IOException e) {
					}
			}
		}
	}

	public static void handleConnection(Socket client) throws IOException {
		while (client.isConnected()) {
			InputStream in = client.getInputStream();
			OutputStream output = client.getOutputStream();

			String input = in.toString();

			output.write("time service");
			output.newLine();


			if (input.equals("time")) {
				output.write(Clock.time());
				output.newLine();
			} else {
				if (input.equals("date")) {

					output.write(Clock.date());
					output.newLine();
				} else {
					client.close();
				}
			}
		}
	}
}
```


Die Klasse Clock sollte nicht verändert werden. 

```
import java.text.SimpleDateFormat;
import java.util.Date;

public class Clock {

	public static SimpleDateFormat timeFormatter = new SimpleDateFormat("kk:mm:ss");
	
	private static SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy");
	private static Date d = new Date();
	
	public static String date() {
		d.setTime(System.currentTimeMillis());
		return dateFormatter.format(d);
	}
	
	public static String time() {
		d.setTime(System.currentTimeMillis());
		return timeFormatter.format(d);
	}
	
}
```


----------



## HoaX (19. Okt 2007)

zeile 33 ist unsin. das ding ist ein inputstream, also benutze read zum lesen. toString gibt dir keinerlei daten zurück die da im stream stehen.

zu deiner clock klasse: wieso verwendest du immer das selbe date objekt und setzt die zeit neu? mach doch in die funktion date() einfach ein "return new Date()" und gut is


----------



## ninili (19. Okt 2007)

Die Clock-Klasse wurde vorgegeben, die kann ich nicht ändern. 

Auch wenn ich die 33. Zeile lösche und die Variablen dann entsprechend abändere, kann ich immernoch keine Ausgabe machen. Wo liegt da der Fehler oder weiß jemand eine andere Methode dafür?


----------



## SlaterB (19. Okt 2007)

zunächst mal: lasse die if/ else weg, und sende etwas zurück, egal welche Eingabe ankommt (in der Testphase)

mit dem Streams bist du wohl noch nicht besonders vertraut oder?
kann ich persönlich im Detail hier kaum erklären,
klaue ein wenig von folgendem Beispiel:
http://www.inf.fu-berlin.de/lehre/SS03/javakurs/index.html
->
http://www.inf.fu-berlin.de/lehre/SS03/javakurs/src/EchoServerThreaded.java

und zwar 

```
BufferedReader is =
	  new BufferedReader(new InputStreamReader(sock.getInputStream()));
	PrintStream os = new PrintStream(sock.getOutputStream(), true);
	String line;
	while ((line = is.readLine()) != null) {
	  os.print(line + "\r\n");
	  os.flush();
	}
```
damit sollte sowohl String lesen (is.readLine()) als auch String schreiben (os.print(line + "\r\n"); ) klappen


----------



## ninili (19. Okt 2007)

Dankeschön, jetzt wird immerhin schon nen Teil ausgegeben. Mit den If-Bedingungen stimmt noch was nicht, aber das müsste ich hinbekommen.


----------

