2013-12-21 1 views
0

나는 자바 7 AsynchronousSocketChannel을 사용하여 간단한 클라이언트 서버 응용 프로그램을 작성하고 있습니다.자바 7 AsynchronousSocketChannel

ObjectInputStream is; 
    ObjectOutputStream os; 

    is = new ObjectInputStream(Channels.newInputStream(client)); 
    System.out.println("Got is"); 
    os = new ObjectOutputStream(Channels.newOutputStream(client)); 
    System.out.println("Got os"); 

클라이언트는 끝에서 동일한 코드를 사용하여 연결이 이루어지면 , 나는와 I/O를 스트림을 초기화하는 서버에 스레드를 시작합니다.

내가 겪고있는 문제는 둘 다 입력 스트림을 먼저 초기화 한 다음 출력 스트림을 초기화하면 양쪽이 중단된다는 것입니다. 다른 세 가지 조합 중 아무 것도 작동합니다. 즉, 은 출력 스트림을 먼저 초기화하거나 입력 스트림을 먼저 초기화하고 다른 하나는 먼저 출력을 초기화합니다.

아무도 이유가 무엇입니까? 와 서버가 수신

InetSocketAddress addr = new InetSocketAddress(host, port); 
    AsynchronousSocketChannel channel = AsynchronousSocketChannel.open(); 
    Future<Void> future = channel.connect(addr); 
    future.get(); // blocks till connection is established 

:이 어떤 통찰력에 대한

InetSocketAddress addr = new InetSocketAddress(port); 
    AsynchronousServerSocketChannel server 
     = AsynchronousServerSocketChannel.open().bind(addr); 

    Future<AsynchronousSocketChannel> future = server.accept(); 
    client = future.get(5, TimeUnit.SECONDS); 
    if (client != null) { 
     // open streams as shown above ... 
    } 

감사

클라이언트와의 연결을 가져옵니다.

답변

2

초기화 할 때 ObjectOutputStream/ObjectInputStream 쌍은 숨겨진 서비스 메시지를 교환합니다. 교환 후 초기화가 완료됩니다. 즉, 한쪽이 ObjectOutputStream을 열면 다른 쪽이 ObjectInputStream을 열어야하며 그 반대도 마찬가지입니다.

BTW 연결 당 스레드를 사용하는 경우 AsynchronousSocketChannel 및 mot plain 소켓을 사용하는 것은 무엇입니까?

+0

그러면 양측이 먼저 출력 스트림을 열 때 어떻게 작동할까요? – user3125878

+0

또한 구식 소켓을 사용할 때 전혀 문제가 보이지 않습니다. 맞습니다. 연결 당 스레드를 사용하고 있다면 비동기를 사용할 필요가 없습니다 (새로운 클래스가 더 잘 최적화 된 경우 제외). 나는이 수업들이 어떻게 함께 작동하는지보기 위해 약간의 실험을하고있다. – user3125878

+0

ObjectInputStream의 API 문서가이 문제에 관해 더 자세히 설명합니다. _ "이 생성자는 해당 ObjectOutputStream이 헤더를 작성하고 플러시 할 때까지 차단됩니다."_ 이렇게하면 처음에 ** ObjectOutputStream **을 양쪽에서 초기화하는 것이 ** 그렇지 않은 이유가 설명됩니다. ** 문제는 있지만 ** ObjectInputStream ** 초기화는 처음에는 양쪽 모두에서 ** 문제가됩니다. – user3125878

관련 문제