問題は、ストリームを作成する順序です。
この記事のサーバー(私が使用しているものだと思います)では、新しい接続が開かれると、サーバーは最初に入力ストリームを開き、次に出力ストリームを開きます。
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行目を入れ替えるだけで実行できます。