speg03の雑記帳

主に未来の自分のために試したことなどを記録しています

直列化オブジェクトの連続した送信

丸一日ぐらいはまっていたのでメモ.

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するときにキャッシュが残っていて,前回のデータを使ったりするらしい.

本当に何でそんな重要なことをjavadocに書いておいてくれないのかと.

結局,writeObjectした後にresetすればよかった.