In Java werden TCP-Sockets (Verbindungsorientiert) mit den Klassen ServerSocket und Socket implementiert:

Server

try (ServerSocket serverSocket = new ServerSocket(port)) {
	while(true) {
		// blockiert bei accept() bis Client::connect:
		try {
			Socket s = serverSocket.accept();
			
			// Senden und Empfangen über Streams und Reader/Writer
			InputStream in = s.getInputStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(in));
			
			OutputStream out = s.getOutputStream();
			PrintWriter writer = new PrintWriter(out);
			
			String input;
			while((input = reader.readLine()) != null) {
				System.out.println(input);
				// Inputs verarbeiten
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
} catch (IOException e) {
	e.printStackTrace();
}
  • serverSocket.accept() ist ein blockierender Aufruf, d.h. die Methode kehrt erst mit return zurück, sobald sich ein neuer Client verbindet

Client

try {
	Socket s = new Socket(hostname, port);
	
	InputStream in = s.getInputStream();
	BufferedReader reader = new BufferedReader(new InputStreamReader(in));
	
	OutputStream out = s.getOutputStream();
	PrintWriter writer = new PrintWriter(out);
	
	String eingang = reader.readLine();
	writer.println("Ich habe empfangen: " + eingang);
	writer.flush();
	
} catch (IOException e) {
	e.printStackTrace();
}

Anmerkungen

  • Über die Streams bzw.Writer/Reader kann technisch gesehen parallel geschrieben und gelesen werden. In den Streams wird jeweils gepuffert (deshalb flush).
  • flush() gibt die Anweisung jetzt explizit den Stream zu “spülen”, d.h. jetzt zu senden (statt noch weiter zu puffern
  • readLine() wird so lange blockiert, bis die Gegenseite ein \n sendet.
  • Schließt ein Gegenüber den Socket, wird readLine() immer null zurück geben