摘要:因?yàn)槭菬o連接的網(wǎng)絡(luò)協(xié)議,所以不能像其它通道那樣讀取和寫入。它發(fā)送和接收的是數(shù)據(jù)包。也不會(huì)通知你發(fā)出的數(shù)據(jù)包是否已收到,因?yàn)樵跀?shù)據(jù)傳送方面沒有任何保證。而是鎖住,讓其只能從特定地址收發(fā)數(shù)據(jù)。只是在數(shù)據(jù)傳送方面沒有任何保證。
Java NIO中的DatagramChannel是一個(gè)能收發(fā)UDP包的通道。因?yàn)閁DP是無連接的網(wǎng)絡(luò)協(xié)議,所以不能像其它通道那樣讀取和寫入。它發(fā)送和接收的是數(shù)據(jù)包。
打開 DatagramChannel
下面是 DatagramChannel 的打開方式:
DatagramChannel channel = DatagramChannel.open(); channel.socket().bind(new InetSocketAddress(9999));
這個(gè)例子打開的 DatagramChannel可以在UDP端口9999上接收數(shù)據(jù)包。
接收數(shù)據(jù)
通過receive()方法從DatagramChannel接收數(shù)據(jù),如:
ByteBuffer buf = ByteBuffer.allocate(48); buf.clear(); channel.receive(buf);
receive()方法會(huì)將接收到的數(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));
這個(gè)例子發(fā)送一串字符到”jenkov.com”服務(wù)器的UDP端口80。 因?yàn)榉?wù)端并沒有監(jiān)控這個(gè)端口,所以什么也不會(huì)發(fā)生。也不會(huì)通知你發(fā)出的數(shù)據(jù)包是否已收到,因?yàn)閁DP在數(shù)據(jù)傳送方面沒有任何保證。
連接到特定的地址
可以將DatagramChannel“連接”到網(wǎng)絡(luò)中的特定地址的。由于UDP是無連接的,連接到特定地址并不會(huì)像TCP通道那樣創(chuàng)建一個(gè)真正的連接。而是鎖住DatagramChannel ,讓其只能從特定地址收發(fā)數(shù)據(jù)。
這里有個(gè)例子:
channel.connect(new InetSocketAddress("jenkov.com", 80));
當(dāng)連接后,也可以使用read()和write()方法,就像在用傳統(tǒng)的通道一樣。只是在數(shù)據(jù)傳送方面沒有任何保證。這里有幾個(gè)例子:
int bytesRead = channel.read(buf); int bytesWritten = channel.write(but);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/71731.html
摘要:通道可以異步讀寫。使用的方法讀取數(shù)據(jù)創(chuàng)建一個(gè)讀數(shù)據(jù)緩沖區(qū)對(duì)象從通道中讀取數(shù)據(jù)使用的方法寫入數(shù)據(jù)創(chuàng)建一個(gè)寫數(shù)據(jù)緩沖區(qū)對(duì)象寫入數(shù)據(jù)關(guān)閉完成使用后,您必須關(guān)閉它。五提供了一種被稱為的新功能,也稱為本地矢量。功能是通道提供的并不是。 歷史回顧: Java NIO 概覽 Java NIO 之 Buffer(緩沖區(qū)) 其他高贊文章: 面試中關(guān)于Redis的問題看這篇就夠了 一文輕松搞懂redis集...
摘要:通常來說所有的的操作都是從開始的一個(gè)類似于一個(gè)和對(duì)比我們可以在同一個(gè)中執(zhí)行讀和寫操作然而同一個(gè)僅僅支持讀或?qū)懣梢援惒降刈x寫而是阻塞的同步讀寫總是從中讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入到中類型有文件操作操作操作操作使用在服務(wù)器端這些通道涵蓋了和網(wǎng)絡(luò)以及文件 Java NIO Channel 通常來說, 所有的 NIO 的 I/O 操作都是從 Channel 開始的. 一個(gè) channel 類似于一個(gè) ...
摘要:學(xué)習(xí)和掌握技術(shù)已經(jīng)不是一個(gè)攻城獅的加分技能,而是一個(gè)必備技能。是雙向的,不僅可以讀取數(shù)據(jù)還能保存數(shù)據(jù),程序不能直接讀寫通道,只與緩沖區(qū)交互為了讓大家不被高并發(fā)與大量連接處理問題所困擾,動(dòng)力節(jié)點(diǎn)推出了高效處理模型應(yīng)用教程。 大家肯定了解Java IO, 但是對(duì)于NIO一般是陌生的,而現(xiàn)在使用到NIO的場景越來越多,很多技術(shù)框...
摘要:異步可以讓你異步的使用,例如當(dāng)線程從通道讀取數(shù)據(jù)到緩沖區(qū)時(shí),線程還是可以進(jìn)行其他事情。當(dāng)數(shù)據(jù)被寫入到緩沖區(qū)時(shí),線程可以繼續(xù)處理它。因此,單個(gè)的線程可以監(jiān)聽多個(gè)數(shù)據(jù)通道。下面是系列文章的目錄概述通道之間的數(shù)據(jù)傳輸與原文譯者郭蕾校對(duì)方騰飛 Java NIO(New IO)是一個(gè)可以替代標(biāo)準(zhǔn)Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標(biāo)準(zhǔn)IO不同的...
摘要:一旦聲明不能改變。后數(shù)據(jù)不能進(jìn)行讀寫位置,表示緩沖區(qū)中正在操作數(shù)據(jù)的位置。標(biāo)記,表示記錄當(dāng)前的位置。緩沖區(qū)的限制不能為負(fù),并且不能大于其容量。一通道用于源節(jié)點(diǎn)與目標(biāo)節(jié)點(diǎn)的連接。 1.Java NIO 簡介 2.Java NIO 與IO 的主要區(qū)別 3.緩沖區(qū)(Buffer)和通道(Channel) 4.文件通道(FileChannel) 5.NIO 的非阻塞式網(wǎng)絡(luò)通信 ?選擇器(Sel...
閱讀 3057·2021-09-10 10:50
閱讀 3245·2019-08-30 14:19
閱讀 3577·2019-08-29 17:31
閱讀 3393·2019-08-29 16:43
閱讀 2261·2019-08-29 14:05
閱讀 2156·2019-08-29 13:17
閱讀 2106·2019-08-26 13:25
閱讀 1831·2019-08-26 12:20