안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
비동기 소켓 채널 :
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 비동기 채널 서버 구현에 대해 공부하겠습니다.
'자바' 카테고리의 다른 글
자바 NIO 비동기 채널 채팅 클라이언트 만들기 (0) | 2017.05.04 |
---|---|
자바 NIO 비동기 채널 채팅 서버 만들기 (0) | 2017.05.04 |
NIO TCP 비동기 채널의 특징, 비동기 채널 그룹 (0) | 2017.04.26 |
자바 NIO TCP 넌블로킹 채팅 서버, 채팅 클라이언트 구현하기 Java Nonblocking chatting server, chatting server (0) | 2017.04.25 |
자바 NIO TCP 넌블로킹 - 선택된 키셋, 채널 작업 처리 (0) | 2017.04.24 |