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 puffernreadLine()wird so lange blockiert, bis die Gegenseite ein\nsendet.- Schließt ein Gegenüber den Socket, wird
readLine()immernullzurück geben