生活随笔
收集整理的這篇文章主要介紹了
Java NIO系列教程(十) Java NIO DatagramChannel
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
轉(zhuǎn)載自??Java NIO系列教程(十) Java NIO DatagramChannel
譯文鏈接? ??作者:Jakob Jenkov ? ?譯者:鄭玉婷 ? ??校對:丁一
Java NIO中的DatagramChannel是一個能收發(fā)UDP包的通道。因為UDP是無連接的網(wǎng)絡(luò)協(xié)議,所以不能像其它通道那樣讀取和寫入。它發(fā)送和接收的是數(shù)據(jù)包。
打開 DatagramChannel
下面是 DatagramChannel 的打開方式:
| 1 | DatagramChannel channel = DatagramChannel.open(); |
| 2 | channel.socket().bind(new?InetSocketAddress(9999)); |
這個例子打開的 DatagramChannel可以在UDP端口9999上接收數(shù)據(jù)包。
接收數(shù)據(jù)
通過receive()方法從DatagramChannel接收數(shù)據(jù),如:
| 1 | ByteBuffer buf = ByteBuffer.allocate(48); |
receive()方法會將接收到的數(shù)據(jù)包內(nèi)容復(fù)制到指定的Buffer. 如果Buffer容不下收到的數(shù)據(jù),多出的數(shù)據(jù)將被丟棄。
發(fā)送數(shù)據(jù)
通過send()方法從DatagramChannel發(fā)送數(shù)據(jù),如:
| 1 | String newData =?"New String to write to file..."?+ System.currentTimeMillis(); |
| 3 | ByteBuffer buf = ByteBuffer.allocate(48); |
| 5 | buf.put(newData.getBytes()); |
| 8 | 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ù)。
這里有個例子:
| 1 | channel.connect(new?InetSocketAddress("jenkov.com",?80)); |
當(dāng)連接后,也可以使用read()和write()方法,就像在用傳統(tǒng)的通道一樣。只是在數(shù)據(jù)傳送方面沒有任何保證。這里有幾個例子:
| 1 | int?bytesRead = channel.read(buf); |
| 2 | int?bytesWritten = channel.write(but); |
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的Java NIO系列教程(十) Java NIO DatagramChannel的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。