Multi-threading is a good thing but it's still not a perfect solution.
Look at this accept loop:
while (true) {
try {
Socket s = ss.accept();
ThreadedEchoServer tes = new ThreadedEchoServer(s);
tes.start();
}
catch (IOException ex) {}
}