參考:http://ifeve.com/datagram-channel/
原文地址
目錄
- Java NIO教程
- Java NIO 教程(一) 概述
- Java NIO 教程(二) Channel
- Java NIO 教程(三) Buffer
- Java NIO 教程(四) Scatter/Gather
- Java NIO 教程(五) 通道之間的數(shù)據(jù)傳輸
- Java NIO 教程(六) Selector
- Java NIO 教程(七) FileChannel
- Java NIO 教程(八) SocketChannel
- Java NIO 教程(九) ServerSocketChannel
- Java NIO 教程(十) 非阻塞式服務(wù)器
- Java NIO 教程(十一) Java NIO DatagramChannel
- Java NIO 教程(十二) Pipe
- Java NIO 教程(十三) Java NIO vs. IO
- Java NIO 教程(十四) Java NIO Path
- Java NIO 教程(十五) Java NIO Files
- Java NIO 教程(十六) Java NIO AsynchronousFileChannel
Java NIO中的DatagramChannel
是一個能收發(fā)UDP包的通道淆党。因為UDP是無連接的網(wǎng)絡(luò)協(xié)議,所以不能像其它通道那樣讀取和寫入缩挑。它發(fā)送和接收的是數(shù)據(jù)包铣猩。
打開 DatagramChannel
下面是 DatagramChannel
的打開方式:
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));
這個例子打開的 DatagramChannel
可以在UDP端口9999上接收數(shù)據(jù)包呼胚。
接收數(shù)據(jù)
通過receive()
方法從DatagramChannel
接收數(shù)據(jù),如:
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
channel.receive(buf);
receive()
方法會將接收到的數(shù)據(jù)包內(nèi)容復(fù)制到指定的Buffer
. 如果Buffer
容不下收到的數(shù)據(jù),多出的數(shù)據(jù)將被丟棄洲鸠。
發(fā)送數(shù)據(jù)
通過send()
方法從DatagramChannel
發(fā)送數(shù)據(jù),如:
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));
這個例子發(fā)送一串字符到”jenkov.com”服務(wù)器的UDP端口80馋缅。 因為服務(wù)端并沒有監(jiān)控這個端口扒腕,所以什么也不會發(fā)生。也不會通知你發(fā)出的數(shù)據(jù)包是否已收到萤悴,因為UDP在數(shù)據(jù)傳送方面沒有任何保證瘾腰。
連接到特定的地址
可以將DatagramChannel
“連接”到網(wǎng)絡(luò)中的特定地址的。由于UDP是無連接的覆履,連接到特定地址并不會像TCP通道那樣創(chuàng)建一個真正的連接蹋盆。而是鎖住DatagramChannel
,讓其只能從特定地址收發(fā)數(shù)據(jù)硝全。
這里有個例子:
channel.connect(new InetSocketAddress("jenkov.com", 80));
當連接后栖雾,也可以使用read()
和write()
方法,就像在用傳統(tǒng)的通道一樣伟众。只是在數(shù)據(jù)傳送方面沒有任何保證析藕。這里有幾個例子:
int bytesRead = channel.read(buf);
int bytesWritten = channel.write(buf);