Socket socket = new Socket("localhost", 3000);
// Text-based: good for simple line-by-line communication
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println("Hello!");
String response = in.readLine(); // blocks until a full line arrives
// Object-based: used from Part 1 of the MCCS series onward
// Always create ObjectOutputStream first on both sides to avoid deadlock
ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream());
objOut.writeObject("Hello!");
String received = (String) objIn.readObject(); // blocks until an object arrives