SocketChannel

Programming/Java NIO 2015. 9. 10. 11:56

Java NIO SocketChannel은 TCP 네트워크 소켓에 연결되는 채널이다. 이는 Java NIO의 Java Networking's Sockets과 동일하다. SocketChannel을 만들 수 있는 두 가지 방법이 있다:

  1. SocketChannel을 열고 인터넷 상의 서버 어딘가에 접속한다.
  2. SocketChannel은 ServerSocketChannel에 연결이 들어왔을 때 생성 될 수 있다.

Opening a SocketChannel


다음 SocketChannel을 여는 방법이다:

SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

Closing a SocketChannel


사용 후 SocketChannel.close() 메소드를 호출하여 SocketChannel을 닫는다. 다음 작업 방법이 있다:

socketChannel.close();    

Reading from a SocketChannel


SocketChannel로부터 데이터를 읽으려면 read() 메소드 중 하나를 호출한다. 다음 예제가 있다:

ByteBuffer buf = ByteBuffer.allocate(48);

int bytesRead = socketChannel.read(buf);

먼저 Buffer가 할당된다. SocketChannel로부터 읽은 데이터는 Buffer에서 읽는다.


그 뒤엔 SocketChannel.read() 메소드가 호출된다. 이 메소드는 Buffer에 SocketChannel로부터 데이터를 읽는다. read() 메소드에 인해 반환된 int는 Buffer에 얼마나 많은 bytes가 기록되었는지 말해준다. 만약 -1이 반환되면, 스트림의 끝(end-of-stream)에 도달했다는 것이다(연결은 닫힌다).

Writing to a SocketChannel


SocketChannel에 기록 데이터는 Buffer 매개변수를 갖는 SocketChannel.write() 메소드를 사용하여 수행된다. 다음 예제가 있다:

String newData = "New String to write to file..." + System.currentTimeMillis();

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());

buf.flip();

while(buf.hasRemaining()) {
    channel.write(buf);

SocketChannel.write() 메소드가 while-loop 안에서 호출되는 방법에 주목하기 바란다. 이는 SocketChannel에 write() 메소드로 얼마만큼 bytes를 기록하는지 보장하지 않는다. 그러므로 우리는 Buffer가 더 이상 기록할 데이터가 없을 때까지 write() 호출을 반복한다.

Non-blocking Mode


SocketChannel을 비블럭킹 모드로 설정할 수 있다. 그러면 비동기 모드로 connect()read(), 그리고 write()를 호출할 수 있다.

connect()


만약 SocketChannel이 비블럭킹 모드에서 connect()를 호출하였다면, 메소드는 연결이  설정되기 전에 반환할 수도 있다. 연결이 설정되었는지를 결정하기 위해서는, 다음과 같이 finishConnect()를 호출할 수 있다:

socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));

while(! socketChannel.finishConnect() ){
    //wait, or do something else...    
}

write()


비블럭킹 모드에서 write() 메소드는 어느것도 기록되지 않고 반환될 수도 있다. 그러므로 반복문 안에서 write() 메소드를 호출해야 할 필요가 있다. 하지만, 이것은 이전 기록하기 예제에서 이미 해봤으므로, 여기서 달리 해야할 것은 없다.

read()


비블럭킹 모드에서 read() 메소드는 읽은 데이터가 전혀 없이 반환될 수도 있다. 그러므로 bytes를 얼마만큼 읽었는지를 알려주는 반환된 int에 주의를 기울여야 한다.

Non-blocking Mode with Selectors


SocketChannel의 비블럭킹 모드는 Selector와 함께 더 잘 동작한다. Selector와 하나 이상의 SocketChannel의 등록으로 Selector에 읽기, 기록 등을 위해 준비된 채널을 요청할 수 있다. Selector와 SocketChannel의 사용 방법은 이 튜토리얼의 다음 텍스트에 더 상세한 설명이 있다.



<원문 출처>


'Programming > Java NIO' 카테고리의 다른 글

DatagramChannel  (0) 2015.09.11
ServerSocketChannel  (0) 2015.09.10
FileChannel  (0) 2015.09.09
Selector  (0) 2015.09.09
Channel to Channel Transfers  (0) 2015.09.09
Posted by 레미파
,