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 |