Проблема в том, как вы создаете потоки:
На сервере из статьи (который, как я полагаю, используется вами), когда открывается новое соединение, сервер сначала открывает поток ввода, а затем поток вывода:
public Connect(Socket clientSocket) {
client = clientSocket;
try {
ois = new ObjectInputStream(client.getInputStream());
oos = new ObjectOutputStream(client.getOutputStream());
} catch(Exception e1) {
// ...
}
this.start();
}
В примере кода с комментариями используется обратный порядок, сначала устанавливается выходной поток, затем входной поток:
// open a socket connection
socket = new Socket("localhost", 2000);
// open I/O streams for objects
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
Но ваш код делает это наоборот:
server = new Socket(host, port);
in = new ObjectInputStream(server.getInputStream());
out = new ObjectOutputStream(server.getOutputStream());
Создание пары выходной поток / входной поток будет зависать до тех пор, пока они не обменяются информацией о квитировании, поэтому вы должны соответствовать порядку создания. Вы можете сделать это, просто поменяв строки 34 и 35 в вашем примере кода.