直列化オブジェクトの連続した送信
丸一日ぐらいはまっていたのでメモ.
SerializableなオブジェクトをObjectOutputStream#writeObject()で連続して送信するときの話.
TestServer.java
import java.io.*; import java.net.*; class TestServer { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(12345); Socket s = ss.accept(); ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); StringBuffer obj = new StringBuffer("hello, client."); System.out.println(obj); oos.writeObject(obj); obj.setCharAt(0, 'H'); System.out.println(obj); oos.writeObject(obj); s.close(); ss.close(); } catch (Exception e) { e.printStackTrace(); } } }
TestClient.java
import java.io.*; import java.net.*; class TestClient { public static void main(String[] args) { try { Socket s = new Socket("localhost", 12345); ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); System.out.println(ois.readObject()); System.out.println(ois.readObject()); s.close(); } catch (Exception e) { e.printStackTrace(); } } }
実行
先にTestServerを実行して,次にTestClientを実行する.
$ java TestServer hello, client. Hello, client.
$ java TestClient hello, client. hello, client.
サーバ側では文字列が変更されているのだけど,クライアント側では変更されていない.
おっかしーなーと思っていたら,どうやらwriteObjectするときにキャッシュが残っていて,前回のデータを使ったりするらしい.
- http://wildduck.opal.ne.jp/diary/?date=20050927
- Oracle Technology Network for Java Developers | Oracle Technology Network | Oracle
本当に何でそんな重要なことをjavadocに書いておいてくれないのかと.
結局,writeObjectした後にresetすればよかった.