자바(SE)

ObjectInputStream 생성 시 주의점

  • -

서버와 클라이언트간 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)

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.