JavaTM 2 Platform
Standard Ed. 6

java.nio.channels
類別 DatagramChannel

java.lang.Object
  繼承者 java.nio.channels.spi.AbstractInterruptibleChannel
      繼承者 java.nio.channels.SelectableChannel
          繼承者 java.nio.channels.spi.AbstractSelectableChannel
              繼承者 java.nio.channels.DatagramChannel
所有已實作的介面:
Closeable, ByteChannel, Channel, GatheringByteChannel, InterruptibleChannel, ReadableByteChannel, ScatteringByteChannel, WritableByteChannel

public abstract class DatagramChannel
extends AbstractSelectableChannel
implements ByteChannel, ScatteringByteChannel, GatheringByteChannel

針對導向資料電報Socket的可選擇通道。

資料電報通道不是網路資料電報Socket的完整抽象。必須通過調用 socket 所獲得的關聯 DatagramSocket 物件來完成Socket選項的綁定和操作。不可能為任意的已有資料電報Socket創建通道,也不可能指定與資料電報通道關聯的資料電報Socket所使用的 DatagramSocketImpl 物件。

通過調用此類別的 open 方法創建資料電報通道。新創建的資料電報通道已打開,但尚未連接。為了使用 sendreceive 方法,無需連接資料電報通道。但是如果為了避免作為每次發送和接收操作的一部分而執行的安全檢查開銷,也可以通過調用資料電報通道的 connect 方法來建立資料電報通道連接。為了使用 readwrite 方法,必須建立資料電報通道連接,因為這些方法不接受或返回Socket位址。

一旦建立了連接,在斷開資料電報通道的連接或將其關閉之前,該資料電報通道保持連接狀態。可通過調用資料電報通道的 isConnected 方法來確定它是否已連接。

多個共時執行緒可安全地使用資料電報通道。儘管在任意給定時刻最多只能有一個執行緒進行讀取和寫入操作,但資料電報通道支持共時的讀寫。

從以下版本開始:
1.4

建構子摘要
protected DatagramChannel(SelectorProvider provider)
          初始化此類別的一個新實例。
 
方法摘要
abstract  DatagramChannel connect(SocketAddress remote)
          連接此通道的Socket。
abstract  DatagramChannel disconnect()
          斷開此通道Socket的連接。
abstract  boolean isConnected()
          判斷是否已連接此通道的Socket。
static DatagramChannel open()
          打開資料電報通道。
abstract  int read(ByteBuffer dst)
          從此通道讀取資料電報。
 long read(ByteBuffer[] dsts)
          從此通道讀取資料電報。
abstract  long read(ByteBuffer[] dsts, int offset, int length)
          從此通道讀取資料電報。
abstract  SocketAddress receive(ByteBuffer dst)
          通過此通道接收資料電報。
abstract  int send(ByteBuffer src, SocketAddress target)
          通過此通道發送資料電報。
abstract  DatagramSocket socket()
          獲取與此通道關聯的資料電報Socket。
 int validOps()
          返回一個操作集,標識此通道所支持的操作。
abstract  int write(ByteBuffer src)
          將資料電報寫入此通道。
 long write(ByteBuffer[] srcs)
          將資料電報寫入此通道。
abstract  long write(ByteBuffer[] srcs, int offset, int length)
          將資料電報寫入此通道。
 
從類別 java.nio.channels.spi.AbstractSelectableChannel 繼承的方法
blockingLock, configureBlocking, implCloseChannel, implCloseSelectableChannel, implConfigureBlocking, isBlocking, isRegistered, keyFor, provider, register
 
從類別 java.nio.channels.SelectableChannel 繼承的方法
register
 
從類別 java.nio.channels.spi.AbstractInterruptibleChannel 繼承的方法
begin, close, end, isOpen
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
從介面 java.nio.channels.Channel 繼承的方法
close, isOpen
 

建構子詳細資訊

DatagramChannel

protected DatagramChannel(SelectorProvider provider)
初始化此類別的一個新實例。

方法詳細資訊

open

public static DatagramChannel open()
                            throws IOException
打開資料電報通道。

通過調用系統級預設 SelectorProvider 物件的 openDatagramChannel 方法來創建新的通道。該通道不會被連接。

返回:
新的資料電報通道
拋出:
IOException - 如果發生 I/O 錯誤

validOps

public final int validOps()
返回一個操作集,標識此通道所支持的操作。

資料電報通道支持讀取和寫入操作,所以此方法返回 (SelectionKey.OP_READ | SelectionKey.OP_WRITE)

指定者:
類別 SelectableChannel 中的 validOps
返回:
有效操作集

socket

public abstract DatagramSocket socket()
獲取與此通道關聯的資料電報Socket。

返回的物件不會宣告任何在 DatagramSocket 類別中未宣告的公共方法。

返回:
與此通道關聯的資料電報Socket

isConnected

public abstract boolean isConnected()
判斷是否已連接此通道的Socket。

返回:
當且僅當已連接此通道的Socket時才返回 true

connect

public abstract DatagramChannel connect(SocketAddress remote)
                                 throws IOException
連接此通道的Socket。

配置該通道的Socket,以便該Socket僅和給定的遠端同位體 位址進行資料電報的接收和發送。一旦連接後,就無法和任何其他位址進行資料電報的接收或發送。在顯式地斷開資料電報Socket的連接或將其關閉之前,該Socket始終保持連接狀態。

此方法執行的安全檢查與 DatagramSocket 類別的 connect 方法執行的安全檢查完全相同。也就是說,如果已安裝了安全管理器,則此方法驗證其 checkAcceptcheckConnect 方法是否分別允許接收來自給定遠端位址的資料電報和向其發送資料電報。

可在任意時間調用此方法。此方法對調用它時正在進行的讀取或寫入操作沒有任何影響。

參數:
remote - 與此通道連接的遠端位址
返回:
此資料電報通道
拋出:
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行連接操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行連接操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
SecurityException - 如果已安裝安全管理器並且它不允許對給定遠端位址進行存取
IOException - 如果發生其他 I/O 錯誤

disconnect

public abstract DatagramChannel disconnect()
                                    throws IOException
斷開此通道Socket的連接。

配置該通道的Socket,只要安全管理器允許(如果已安裝),該Socket就可和任何遠端位址進行資料電報的接收和發送。

可在任意時間調用此方法。此方法對調用它時正在進行的讀取或寫入操作沒有任何影響。

如果未連接此通道的Socket,或者通道已關閉,則調用此方法無效。

返回:
此資料電報通道
拋出:
IOException - 如果發生其他 I/O 錯誤

receive

public abstract SocketAddress receive(ByteBuffer dst)
                               throws IOException
通過此通道接收資料電報。

如果資料電報直接可用,並且此通道處於阻塞網要但最終會變得可用,則將資料電報複製到給定的位元組緩衝區中並返回資料電報的源位址。如果此通道處於非阻塞網要並且沒有直接可用的資料電報,則此方法直接返回 null

該資料電報被傳輸到給定的位元組緩衝區中,並從緩衝區的當前位置開始存儲,如同正規的 read 操作一樣。如果緩衝區中的剩餘位元組空間小於保存資料電報所需的空間,則丟棄餘下的資料電報。

此方法執行的安全檢查與 DatagramSocket 類別的 receive 方法執行的安全檢查完全相同。也就是說,如果該Socket未連接到特定的遠端位址,並且已安裝了安全管理器,則對於接收到的每個資料電報,此方法都會驗證安全管理器的 checkAccept 方法是否允許使用該資料電報的源位址和埠號號。避免此項安全檢查開銷的方法是首先通過 connect 方法連接該Socket。

可在任意時間調用此方法。但是如果另一個執行緒已經在此通道上發起了一個讀取操作,則在該操作完成前此方法的調用被阻塞。

參數:
dst - 要向其中傳輸資料電報的緩衝區
返回:
資料電報的源位址,或者如果此通道處於非阻塞網要並且沒有直接可用的資料電報,則返回 null
拋出:
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
SecurityException - 如果已安裝安全管理器並且它不允許接受該資料電報發送者所發送的資料電報
IOException - 如果發生其他 I/O 錯誤

send

public abstract int send(ByteBuffer src,
                         SocketAddress target)
                  throws IOException
通過此通道發送資料電報。

如果此通道處於非阻塞網要並且底層輸出緩衝區中沒有足夠的空間,或者如果此通道處於阻塞網要並且緩衝區中有足夠的空間,則將給定緩衝區中的剩餘位元組以單個資料電報的形式傳送到給定的目標位址。

從位元組緩衝區傳輸資料電報如同通過正規的 write 操作一樣。

此方法執行的安全檢查與 DatagramSocket 類別的 send 方法執行的安全檢查完全相同。也就是說,如果該Socket未連接到指定的遠端位址,並且已安裝了安全管理器,則對於每個發送的資料電報,此方法都會驗證安全管理器的 checkConnect 方法是否允許使用該資料電報的目標位址和埠號號。避免此項安全檢查開銷的方法是首先通過 connect 方法連接該Socket。

可在任意時間調用此方法。但是如果另一個執行緒已經在此通道上發起了一個寫入操作,則在該操作完成前此方法的調用被阻塞。

參數:
src - 套件含要發送的資料電報的緩衝區
target - 要將資料電報發送到的位址
返回:
發送的位元組數,可能是調用此方法時源緩衝區中剩餘的位元組數,或者如果此通道處於非阻塞網要並且底層輸出緩衝區中沒有足夠的空間供資料電報使用,則可能為零
拋出:
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
SecurityException - 如果已安裝安全管理器並且它不允許將資料電報發送到給定位址
IOException - 如果發生其他 I/O 錯誤

read

public abstract int read(ByteBuffer dst)
                  throws IOException
從此通道讀取資料電報。

僅在此通道的Socket已連接時才調用此方法,並且此方法僅接受來自該Socket同位體的資料電報。如果資料電報中的位元組數大於給定緩衝區中的剩餘空間,則丟棄餘下的資料電報。否則此方法的行為與 ReadableByteChannel 介面中指定的行為完全相同。

指定者:
介面 ReadableByteChannel 中的 read
參數:
dst - 要向其中傳輸位元組的緩衝區
返回:
讀取的位元組數,可能為零,如果該通道已到達串流的末尾,則返回 -1
拋出:
NotYetConnectedException - 如果未連接此通道的Socket
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException - 如果發生其他 I/O 錯誤

read

public abstract long read(ByteBuffer[] dsts,
                          int offset,
                          int length)
                   throws IOException
從此通道讀取資料電報。

僅在此通道的Socket已連接時才調用此方法,並且此方法僅接受來自該Socket同位體的資料電報。如果資料電報中的位元組數大於給定緩衝區中的剩餘空間,則丟棄餘下的資料電報。否則此方法的行為與 ScatteringByteChannel 介面中指定的行為完全相同。

指定者:
介面 ScatteringByteChannel 中的 read
參數:
dsts - 要向其中傳輸位元組的緩衝區
offset - 第一個緩衝區(位元組傳輸到該緩衝區中)在緩衝區陣列中的偏移量;必須為非負數並且不能大於 dsts.length
length - 要存取的最大緩衝區數;必須為非負數並且不能大於 dsts.length - offset
返回:
讀取的位元組數,可能為零,如果該通道已到達串流的末尾,則返回 -1
拋出:
NotYetConnectedException - 如果未連接此通道的Socket
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException - 如果發生其他 I/O 錯誤

read

public final long read(ByteBuffer[] dsts)
                throws IOException
從此通道讀取資料電報。

僅在此通道的Socket已連接時才調用此方法,並且此方法僅接受來自該Socket同位體的資料電報。如果資料電報中的位元組數大於給定緩衝區中的剩餘空間,則丟棄餘下的資料電報。否則此方法的行為與 ScatteringByteChannel 介面中指定的行為完全相同。

指定者:
介面 ScatteringByteChannel 中的 read
參數:
dsts - 要向其中傳輸位元組的緩衝區
返回:
讀取的位元組數,可能為零,如果該通道已到達串流的末尾,則返回 -1
拋出:
NotYetConnectedException - 如果未連接此通道的Socket
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行讀取操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行讀取操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒設置為中斷狀態
IOException - 如果發生其他 I/O 錯誤

write

public abstract int write(ByteBuffer src)
                   throws IOException
將資料電報寫入此通道。

僅在此通道的Socket已連接時才調用此方法,在這種情況下,此方法將資料電報直接發送到Socket的同位體。否則此方法的行為與 WritableByteChannel 介面中指定的行為完全相同。

指定者:
介面 WritableByteChannel 中的 write
參數:
src - 要從中獲取位元組的緩衝區
返回:
寫入的位元組數,可能為零
拋出:
NotYetConnectedException - 如果未連接此通道的Socket
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException - 如果發生其他 I/O 錯誤

write

public abstract long write(ByteBuffer[] srcs,
                           int offset,
                           int length)
                    throws IOException
將資料電報寫入此通道。

僅在此通道的Socket已連接時才調用此方法,在這種情況下,此方法將資料電報直接發送到Socket的同位體。否則此方法的行為與 GatheringByteChannel 介面中指定的行為完全相同。

指定者:
介面 GatheringByteChannel 中的 write
offset - 第一個緩衝區(要獲取該緩衝區中的位元組)在緩衝區陣列中的偏移量;必須為非負數並且不能大於 srcs.length
length - 要存取的最大緩衝區數;必須為非負數並且不能大於 srcs.length - offset
返回:
發送的位元組數,可能是調用此方法時源緩衝區中剩餘的位元組數,或者如果此通道處於非阻塞網要並且底層輸出緩衝區中沒有足夠的空間供資料電報使用,則可能為零
拋出:
NotYetConnectedException - 如果未連接此通道的Socket
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException - 如果發生其他 I/O 錯誤

write

public final long write(ByteBuffer[] srcs)
                 throws IOException
將資料電報寫入此通道。

僅在此通道的Socket已連接時才調用此方法,在這種情況下,此方法將資料電報直接發送到Socket的同位體。否則此方法的行為與 GatheringByteChannel 介面中指定的行為完全相同。

指定者:
介面 GatheringByteChannel 中的 write
返回:
發送的位元組數,可能是調用此方法時源緩衝區中剩餘的位元組數,或者如果此通道處於非阻塞網要並且底層輸出緩衝區中沒有足夠的空間供資料電報使用,則可能為零
拋出:
NotYetConnectedException - 如果未連接此通道的Socket
ClosedChannelException - 如果此通道已關閉
AsynchronousCloseException - 如果正在進行寫入操作時另一個執行緒關閉了此通道
ClosedByInterruptException - 如果正在進行寫入操作時另一個執行緒中斷了當前執行緒,因此關閉了該通道並將當前執行緒的狀態設置為中斷
IOException - 如果發生其他 I/O 錯誤

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only