서버와 클라이언트간 Object 스트림을 이용해서 통신할 경우가 있다.
이때 스트림 생성 순서에 주의가 필요하다.
ObjectInputStream은 생성 시 Socket의 InputStream으로부터 object stream header를 읽으려고 한다.
아래 생성자에서 4바이트의 매직 시퀀스를 읽으려고 하는 부분을 살펴볼 수 있다.
public ObjectInputStream(InputStream in) throws IOException {
verifySubclass();
bin = new BlockDataInputStream(in);
handles = new HandleTable(10);
vlist = new ValidationList();
serialFilter = ObjectInputFilter.Config.getSerialFilter();
enableOverride = false;
readStreamHeader(); // 이 부분이 streamHeader를 읽어들이는 부분 - 못읽으면 계속 대기한다.
bin.setBlockDataMode(true);
}
그런데 원격지의 ObjectOutputStream이 이 헤더값을 써주지 않으면 읽을 수 없기 때문에 계속 기다리게 된다.
따라서 서버와 클라이언트 모두 ObjectInputStream을 먼저 생성하면 안된다.
javadoc 참조
(http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#ObjectInputStream%28java.io.InputStream%29)