Teaching Java Networking Through Failure-First Labs
If students only run “happy path” socket examples, they graduate with fragile intuition. A better lab design injects realistic failures first, then teaches recovery patterns.
Step 1: Start with a tiny echo service and explicit timeouts
Socket socket = new Socket();
socket.connect(new InetSocketAddress(host, port), 1500);
socket.setSoTimeout(1500);
Step 2: Simulate network instability in the test harness
class FlakyStream extends InputStream {
private final Random r = new Random();
public int read() throws IOException {
if (r.nextInt(12) == 0) throw new SocketTimeoutException("simulated");
return 'A';
}
}
Step 3: Grade recovery logic, not just successful output
record AttemptResult(boolean success, int retries, long elapsedMs) {}
Pitfalls to avoid
- No timeout settings, so exercises hang indefinitely.
- Students swallow exceptions and hide root causes.
- Rubrics reward output only, not resilience behavior.
Validation checklist
- Labs pass under both stable and unstable network simulation.
- Retry/backoff strategy is measurable in logs.
- Students can explain why each timeout value exists.