Java NIO DatagramChannel은 UDP 패킷들을 송수신 할 수 있는 채널이다. UDP는 연결이 없는 네트워크 프로토콜이기 때문에, 다른 채널들처럼 DatagramChannel에 기본적으로 읽거나 쓸 수 없다. 대신 데이터 패킷을 송수신 한다.

Opening a DatagramChannel


다음 DatagramChannel을 여는 방법이 있다:

DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));

이 예제는 UDP의 9999 포트로 패킷을 수신할 수 있는 DatagramChannel을 연다.

Receiving Data


아래와 같이 receive() 메소드를 호출하여 DatagramChannel로부터 데이터를 수신한다:

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();

channel.receive(buf); 

receive() 메소드는 주어진 Buffer에 수신된 데이터 패킷의 내용을 복사할 것이다. 만약 수신된 패킷이 Buffer가 수용할 수 있는 것보다 많은 데이터를 포함한다면, 나머지 데이터는 조용히 버려지게 된다.

Sending Data


아래와 같이 send() 메소드를 호출하여 DatagramChannel을 통해 데이터를 전송할 수 있다:

String newData = "New String to write to file..."
                    + System.currentTimeMillis();
    
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();

int bytesSent = channel.send(buf, new InetSocketAddress("jenkov.com", 80));

이 예제는 UDP의 80 포트로 "jenkov.com" 서버에 문자열을 전송한다. 포트에서 아무것도 수신된 것은 없고, 아무일도 일어나지 않을 것이다. UDP는 데이터의 전달에 관한 어떠한 보장도 하지 않기 때문에, 보낸 패킷의 수신되었는지를 알 수 없을 것이다.

Connecting to a Specific Address


네트워크상의 특정 주소에 DatagramChannel을 "연결"하는 것이 가능하다. UDP는 연결이 없기 때문에, 주소에 연결하는 방법은 TCP 채널처럼 실제 연결을 생성하지 않는다. 오히려 그것은 DatagramChannel을 잠궈 오직 하나의 특정 주소로부터 데이터 패킷을 송수신 할 수 있게된다.


다음 예제가 있다:

channel.connect(new InetSocketAddress("jenkov.com", 80));    

연결 되었을 때, 기존 채널에서 사용하는 것 처럼 read()와 write() 메소드 또한 사용할 수 있다. 단지 보낸 데이터의 전달에 관해 어떠한 보장도 받지 못할 뿐이다. 다음 몇 가지 예들이 있다:

int bytesRead = channel.read(buf);    
int bytesWritten = channel.write(buf);



<원문 출처>

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

vs. IO  (0) 2015.09.15
Pipe  (0) 2015.09.15
ServerSocketChannel  (0) 2015.09.10
SocketChannel  (0) 2015.09.10
FileChannel  (0) 2015.09.09
Posted by 레미파
,