Memra

Networking basics (overview)

◈ 4 cards

Socket/ServerSocket, the client–server shape, and getting streams over a connection.

Sockets: streams over the network

Java networking reuses everything you learned about streams. A TCP connection is just two streams — one to read, one to write — that happen to run between two machines. The two endpoints play different roles:

  • A ServerSocket listens on a port and accepts incoming connections. accept() blocks until a client connects, then returns a Socket representing that one conversation.
  • A Socket is one end of a live connection. The client creates one by naming the server's host and port; the server gets one back from accept(). Either side then calls getInputStream() / getOutputStream() and reads/writes exactly like any other stream.

The minimal echo server

try (ServerSocket server = new ServerSocket(8080);
     Socket conn = server.accept()) {        // blocks for a client
    BufferedReader in = new BufferedReader(
        new InputStreamReader(conn.getInputStream()));
    PrintWriter out = new PrintWriter(conn.getOutputStream(), true);
    String line = in.readLine();
    out.println("echo: " + line);           // send it back
}

The true second argument to PrintWriter turns on auto-flush so each println is pushed to the network immediately instead of sitting in the buffer — important for an interactive protocol where the other side is waiting for your reply.

The matching client

try (Socket s = new Socket("localhost", 8080)) {
    PrintWriter out = new PrintWriter(s.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
        new InputStreamReader(s.getInputStream()));
    out.println("hello");
    System.out.println(in.readLine());       // prints: echo: hello
}

Notice the symmetry: the server's output stream feeds the client's input stream and vice versa. To serve many clients at once, the server loops on accept() and hands each returned Socket to its own thread — which connects directly to the concurrency you study in Module 10.

URL for higher-level access

For fetching a web resource you rarely touch raw sockets; java.net.URL wraps the protocol. new URL("http://example.com").openStream() hands back an InputStream of the response body, which you wrap in a BufferedReader like any other text source — the same stream model, one layer up.

t1t2t3t4serverlisten :8080accept() waitsSocket connecho: helloclientconnect :8080helloaccept() unblocks only when a client connects.
The handshake is asymmetric: the server is already parked inside <code>accept()</code> before the client exists. That parked thread is the whole reason a real server dispatches each returned <code>Socket</code> to a worker.
NORMAL ~/memra/learn/comp-308/networking-basics utf-8 LF