Memra

Networking basics (overview)

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.

NORMAL ~/memra/learn/comp-308/networking-basics utf-8 LF