자바

자바 NIO TCP 비동기 채널 - 서버 소켓 채널, 소켓 채널, 소켓 채널 데이터 통신

알통몬_ 2017. 4. 27. 20:17
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


비동기 소켓 채널 :

AsynchronousServerSocketChannel 은 두 개의 open() 정적 메소드를 호출해 얻을 수 있습니다.

기본 비동기 채널 그룹에 포함되는 비동기 서버 소켓 채널은 얻는 방법은 아래와 같습니다.

AsynchronousServerSocketChannel asynchronousServerSocketChannel = 

AsynchronousServerSocketChannel.open();


별도로 비동기 채널 그룹을 생성 후 생성한 채널에 포함되는 비동기 서버 소켓 채널을 얻을려면


AsynchronousChannelGroup channelGroup = AsynchronousChannelGroup.withFixedThreadPool(

   Runtime.getRuntime().availableProcessors(),

   Executors.defaultThreadFactory()

);

AsynchronousServerSocketChannel synchronousServerSocketChannel = 

AsynchronousServerSocketChannel.open(channelGroup);

비동기 채널 그룹을 매개 값으로 갖는 open()을 호출하면 됩니다.



비동기 서버 소켓 채널을 생성한 후에는 bind()를 호출해 포트 바인딩을 해야합니다.

asynchronousServerSocketChannel.bind( new InetSocketAddress(5001) );


비동기 서버 소켓 채널을 더 이상 사영하지 않는다면 close()를 호출해서 서버가 사용한

포트를 언바인딩해야합니다.

asynchronousServerSocketChannel.close();


비동기 서버 소켓 채널은 스레드풀을 이용해 비동기 처리로 연결 수락 작업을 합니다.

accept( A attachment, CompletionHandler<AsynchronousServerSocketChannel, A> handler);

첫번 째 매개 값은 콜백 메소드의 매개 값으로 제공할 첨부 객체입니다.

연결 수락 작업을 하는데에는 별도의 첨부 객체가 필요하지 않아서 null로 지정합니다.

두번 째 매개 값은 콜백 메소드를 가지고 있는

ComletionHandler<AsynchronousServerSocketChannel, A> 구현 객체입니다.

A는 첨부 객체 타입이고, 연결 수락 작업에는 별도의 첨부 객체가 필요하지 않기 때문에

Void로 지정합니다.


accept() 호출 기본 코드

 

asynchronousServerSocketChannel.accept(null,

  new ComletionHandler<AsynchronousServerSocketChannel, Void>() {

 @Override

 public void completed(AsynchronousServerSocketChannel asynchronousServerSocketChannel,

                           Void attachment) {

           //연결 수락 후 실행할 코드

           asynchronousServerSocketChannel.accept(null,this);

 }

 @Override

  public void failed(Throwable exc, Void attachment) {

    // 연결 수락 실패 시 수행할 코드

 }

});


completed()는 연결 수락이 완료 되었을 때 스레드풀의 스레드가 호출,

첫 번째 매개값 : AsynchronousServerSocketChannel 이 대입

두 번째 매개값 : 첨부 객체이다, 첫번째 매개값이 null이므로 null이 대입


스레드풀에 스레드가 연결 수락에 문제가 생겨 예외를 발생시키면 failed() 호출.

첫 번째 매개값 : 예외 객체

두 번째 매개값 : 첨부 객체 , accept()의 첫 번째 매개값이 null이므로 null대입.


* accept()를 반복 호출하는 무한 루프가 없고, 대신에 completed()메소드 끝에 accept()를

재호출해서 반복적으로 클라이언트 연결 수락 작업을 수행.




비동기 소켓 채널 :

AsynchronousSocketChannel 은 서버와 클라이언트에 각각 존재합니다.

클라이언트가 비동기 소켓 채널을 생성하ㅐ서 서버로 연결 요청을 하면 서버의

비동기 서버 소켓 채널은 연결을 수락한 후에 비동기 소켓 채널을 생성해

서로 통신할 수 있도록 만들어줍니다.


 비동기 서버 소켓 채널이 생성하는 비동기 소켓 채널은 자동적으로

비동기 서버 소켓 채널과 같은 비동기 채널 그룹에 속하게 됩니다.


클라이언트에서 비동기 소켓 채널을 생성하려면 두 가지 open()을 사용합니다.

AsynchronousSocketChannel asynchronousSocketChannel = AsynchronousSocketChannel.open();

=> 기본 비동기 채널에 포함.

------------------------------------------------------------------------

AsynchronousChannelGroup channelGroup = AsynchronousChannelGroup.withFixedThreadPool(

   Runtime.getRuntime().availableProcessors(),

   Executors.defaultThreadFactory()

);

AsynchronousSocketChannel AsynchronousSocketChannel = 

AsynchronousSocketChannel.open(channelGroup);

 => 별도의 비동기 채널 그룹을 생성후 이 그룹에 포함되는 AsynchronousSocketChannel 을

    얻습니다.


AsynchronousSocketChannel 을 더 이상 사용하지 않을 경우 close()를 호출해서 연결 끊어줍니다.

asynchronousSocketChannel.close();


클라이언트가 생성하는 비동기 소켓 채널은 서버 연결 요청 작업을 스레드풀을 이용해서 비동기 처리합니다.

connect()를 호출하는 코드

connect(SocketAddress remote, A attachment, CompletionHandler<Void, A> handler);

첫번 째 매개 값은서버 IP와 연결 포트 정보를 가진 ,InetSocketAddress 객체입니다.

두번 째 매개 값은 콜백 메서드의 매개값으로 제공할 첨부 객체입니다.

 연결 요청 작업에는 별도의 첨부 객체가 필요하지 않으므로 null로 지정합니다.

세번 째 매개 값은 CompletionHandler<Void, A> 구현 객체 , A는 첨부 객체 타입, 

연결 요청 작업에는 별도의 첨부 객체가 필요하지 않으므로 Void로 지정합니다.


connect()를 호출하는 기본 코드

asynchronousSocketChannel.connect(new InetSocketAddress("localhost", 5001), null,

    new CompletionHandler<Void, Void>() {

    @Override

    public void completed(Void result, Void attachment) {

        // 연결 성공후 실행할 코드

    }

   @Override

   public void failed(Throwable e, Void attachment){

      //연결 실패후 실행할 코드

   }

});

completed()는 연결이 성공했을 때 스레드풀의 스레드 호출

첫번 째 매개값 : null 대입

두번 째 매개값 : 첨부 객체, connect()의 두번째 매개값이 null 이므로 null 대입

서버가 보낸 데이터를 받기 위한 코드가 일반적으로 작성됨.


스레드풀의 스레드가 연결 요청에 문제가 생겨 예외가 발생되면 failed()가 호출

첫번 째 매개값 : 예외 객체

두번 째 매개값 : 첨부 객체, connect()의 두번 째 매개값이 null 이므로 null 대입



비동기 소켓 채널 데이터 통신 :

클라이언트와 서버가 연결되면 양쪽 비동기 소켓 채널의 read() 와 write() 로 데이터 통신이 가능합니다.

메소드들은 호출하는 즉시 리턴하고 실직적인 입출력 작업은 스레드풀의 스레드가 담당합니다.


read(ByteBuffer dst, A attachment, CompletionHandler<Integer, A> handler);

write(ByteBuffer src, A attachment, CompletionHandler<Integer, A> handler);

첫번 째 매개값은 읽고 쓰기 위한 ByteBuffer 객체입니다.

두번 째 매개값은 콜백 메서드의 매개값으로 전달한 첨부 객체입니다.

세번 째 매개값은 CompletionHandler<Integer, A> 구현 객체입니다.

Integer : 읽고 쓴 바이트 수, A 첨부 객체 타입입니다.

 


read() 를 호출하는 기본 코드 :

 

asynchronousSocketChannel.read(byteBuffer, attachment,

        new CompletionHandler<Integer, A>() {

        @Override

        public void completed(Integer result, A attachment) {

         //받은 데이터 처리 코드

         asynchronousSocketChannel.read(byteBuffer, attachment, this);

         // read() 메서드 재 호출

        @Override

        public void failed(Throwable exc, A attachment) {

        //실패된 경우 실행할 코드

        }

});


스레드풀의 작업 스레드가 읽기 작업을 완료하면 completed() 호출,

completed()의

첫번 째 매개 값은 읽은 바이트 수입니다.

두번 째 매개 값은 첨부 객체 ,read() 호출 시 사용된 두번 째 매개값이 대입됩니다.

스레드풀의 작업 스레드에서 읽기 작업 중에 문제가 생겨 예외가 발생하면 스레드는 failed() 호출

failed()의

첫 번째 매개 값은 예외 객체입니다.

두 번째 매개 값은 read() 호출시 사용된 두번 째 매개값 대입.



write() 를 호출하는 기본 코드 :

 

asynchronousSocketChannel.write(byteBuffer, attachment,

        new CompletionHandler<Integer, A>() {

        @Override

        public void completed(Integer result, A attachment) {

         //받은 데이터 처리 코드

        }

        @Override

        public void failed(Throwable exc, A attachment) {

        //실패된 경우 실행할 코드

        }

});

스레드풀의 작업 스레드가 쓰기 작업을 완료하면 completed() 호출,

completed()의

첫번 째 매개 값은 읽은 바이트 수입니다.

두번 째 매개 값은 첨부 객체 ,write()호출 시 사용된 두번 째 매개값이 대입됩니다.

스레드풀의 작업 스레드에서 읽기 작업 중에 문제가 생겨 예외가 발생하면 스레드는 failed() 호출

failed()의

첫 번째 매개 값은 예외 객체입니다.

두 번째 매개 값은 write() 호출시 사용된 두번 째 매개값 대입됩니다.


이상입니다.


다음 포스팅에서는 TCP 비동기 채널 서버 구현에 대해 공부하겠습니다.


반응형