Java: a TCP echo server on the loopback interface

TCP gives two programs a reliable, ordered byte stream. A server creates a ServerSocket bound to an address and port and calls accept, which blocks until a client connects. The client creates a Socket to that address and port. Each side then reads and writes through input and output streams.

Java
import java.io.*;
import java.net.*;

class Main {
  public static void main(String[] args) throws Exception {
    try (ServerSocket server = new ServerSocket(0, 1, InetAddress.getLoopbackAddress())) {
      int port = server.getLocalPort();
      Thread serverThread = new Thread(() -> {
        try (Socket client = server.accept();
             BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
             PrintWriter out = new PrintWriter(client.getOutputStream(), true)) {
          String line = in.readLine();
          out.println("echo: " + line);
        } catch (IOException e) {
          System.out.println("server error: " + e.getMessage());
        }
      });
      serverThread.start();

      try (Socket socket = new Socket(InetAddress.getLoopbackAddress(), port);
           PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
           BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
        out.println("hello");
        System.out.println(in.readLine());
      }
      serverThread.join();
    }
  }
}
Read the full lesson