JavaTM 2 Platform
Standard Ed. 6

java.net
類別 DatagramSocket

java.lang.Object
  繼承者 java.net.DatagramSocket
直接已知子類別:
MulticastSocket

public class DatagramSocket
extends Object

此類別表示用來發送和接收資料電報封包的Socket。

資料電報Socket是包投遞服務的發送或接收點。每個在資料電報Socket上發送或接收的套件都是單獨編址和路由的。從一台機器發送到另一台機器的多個包可能選擇不同的路由,也可能按不同的順序到達。

在 DatagramSocket 上總是啟用 UDP 廣播發送。為了接收廣播包,應該將 DatagramSocket 綁定到通配符位址。在某些實作中,將 DatagramSocket 綁定到一個更加具體的位址時廣播包也可以被接收。

範例:DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 這等價於:DatagramSocket s = new DatagramSocket(8888); 兩個例子都能創建能夠在 UDP 8888 埠號上接收廣播的 DatagramSocket。

從以下版本開始:
JDK1.0
另請參見:
DatagramPacket, DatagramChannel

建構子摘要
  DatagramSocket()
          建構資料電報Socket並將其綁定到本地主機上任何可用的埠號。
protected DatagramSocket(DatagramSocketImpl impl)
          創建帶有指定 DatagramSocketImpl 的未綁定資料電報Socket。
  DatagramSocket(int port)
          創建資料電報Socket並將其綁定到本地主機上的指定埠號。
  DatagramSocket(int port, InetAddress laddr)
          創建資料電報Socket,將其綁定到指定的本地位址。
  DatagramSocket(SocketAddress bindaddr)
          創建資料電報Socket,將其綁定到指定的本地Socket位址。
 
方法摘要
 void bind(SocketAddress addr)
          將此 DatagramSocket 綁定到特定的位址和埠號。
 void close()
          關閉此資料電報Socket。
 void connect(InetAddress address, int port)
          將Socket連接到此Socket的遠端位址。
 void connect(SocketAddress addr)
          將此Socket連接到遠端Socket位址(IP 位址 + 埠號號)。
 void disconnect()
          斷開Socket的連接。
 boolean getBroadcast()
          檢測是否啟用了 SO_BROADCAST。
 DatagramChannel getChannel()
          返回與此資料電報Socket關聯的唯一 DatagramChannel 物件(如果有)。
 InetAddress getInetAddress()
          返回此Socket連接的位址。
 InetAddress getLocalAddress()
          獲取Socket綁定的本地位址。
 int getLocalPort()
          返回此Socket綁定的本地主機上的埠號號。
 SocketAddress getLocalSocketAddress()
          返回此Socket綁定的端點的位址,如果尚未綁定則返回 null
 int getPort()
          返回此Socket的埠號。
 int getReceiveBufferSize()
          獲取此 DatagramSocket 的 SO_RCVBUF 選項的值,該值是平臺在 DatagramSocket 上輸入時使用的緩衝區大小。
 SocketAddress getRemoteSocketAddress()
          返回此Socket連接的端點的位址,如果未連接則返回 null
 boolean getReuseAddress()
          檢測是否啟用了 SO_REUSEADDR。
 int getSendBufferSize()
          獲取此 DatagramSocket 的 SO_SNDBUF 選項的值,該值是平臺在 DatagramSocket 上輸出時使用的緩衝區大小。
 int getSoTimeout()
          獲取 SO_TIMEOUT 的設置。
 int getTrafficClass()
          為從此 DatagramSocket 上發送的套件獲取 IP 資料電報頭中的串流量類別別或服務型別。
 boolean isBound()
          返回Socket的綁定狀態。
 boolean isClosed()
          返回是否關閉了Socket。
 boolean isConnected()
          返回Socket的連接狀態。
 void receive(DatagramPacket p)
          從此Socket接收資料電報封包。
 void send(DatagramPacket p)
          從此Socket發送資料電報封包。
 void setBroadcast(boolean on)
          啟用/禁用 SO_BROADCAST。
static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac)
          為應用程序設置資料電報Socket實作處理器。
 void setReceiveBufferSize(int size)
          將此 DatagramSocket 的 SO_RCVBUF 選項設置為指定的值。
 void setReuseAddress(boolean on)
          啟用/禁用 SO_REUSEADDR Socket選項。
 void setSendBufferSize(int size)
          將此 DatagramSocket 的 SO_SNDBUF 選項設置為指定的值。
 void setSoTimeout(int timeout)
          啟用/禁用帶有指定逾時值的 SO_TIMEOUT,以毫秒為單位。
 void setTrafficClass(int tc)
          為從此 DatagramSocket 上發送的資料電報在 IP 資料電報頭中設置串流量類別別 (traffic class) 或服務型別八位組 (type-of-service octet)。
 
從類別 java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

建構子詳細資訊

DatagramSocket

public DatagramSocket()
               throws SocketException
建構資料電報Socket並將其綁定到本地主機上任何可用的埠號。Socket將被綁定到通配符位址,IP 位址由內核來選擇。

如果有安全管理器,則首先使用 0 作為變數來調用其 checkListen 方法,以確保允許該操作。這可能會導致 SecurityException 異常。

拋出:
SocketException - 如果Socket不能被打開,或不能將其綁定到指定的本地埠號。
SecurityException - 如果安全管理器存在並且其 checkListen 方法不允許進行該操作。
另請參見:
SecurityManager.checkListen(int)

DatagramSocket

protected DatagramSocket(DatagramSocketImpl impl)
創建帶有指定 DatagramSocketImpl 的未綁定資料電報Socket。

參數:
impl - 子類別希望在 DatagramSocket 上使用的 DatagramSocketImpl 的實例。
從以下版本開始:
1.4

DatagramSocket

public DatagramSocket(SocketAddress bindaddr)
               throws SocketException
創建資料電報Socket,將其綁定到指定的本地Socket位址。

如果位址為 null,創建未綁定的Socket。

如果有安全管理器,則首先使用Socket中的埠號作為變數來調用其 checkListen 方法,以確保允許該操作。這可能會導致 SecurityException 異常。

參數:
bindaddr - 要綁定的本地Socket位址,對於未綁定的Socket為 null
拋出:
SocketException - 如果Socket不能被打開,或不能將其綁定到指定的本地埠號。
SecurityException - 如果安全管理器存在並且其 checkListen 方法不允許進行該操作。
從以下版本開始:
1.4
另請參見:
SecurityManager.checkListen(int)

DatagramSocket

public DatagramSocket(int port)
               throws SocketException
創建資料電報Socket並將其綁定到本地主機上的指定埠號。Socket將被綁定到通配符位址,IP 位址由內核來選擇。

如果存在安全管理器,則首先使用 port 參數作為參數調用其 checkListen 方法,以確保允許該操作。這可能會導致 SecurityException 異常。

參數:
port - 要使用的埠號。
拋出:
SocketException - 如果Socket不能被打開,或不能將其綁定到指定的本地埠號。
SecurityException - 如果安全管理器存在並且其 checkListen 方法不允許進行該操作。
另請參見:
SecurityManager.checkListen(int)

DatagramSocket

public DatagramSocket(int port,
                      InetAddress laddr)
               throws SocketException
創建資料電報Socket,將其綁定到指定的本地位址。本地埠號必須在 0 到 65535 之間(包括兩者)。如果 IP 位址為 0.0.0.0,Socket將被綁定到通配符位址,IP 位址由內核選擇。

如果存在安全管理器,則首先使用 port 參數作為參數調用其 checkListen 方法,以確保允許該操作。這可能會導致 SecurityException 異常。

參數:
port - 要使用的本地埠號
laddr - 要綁定的本地位址
拋出:
SocketException - 如果Socket不能被打開,或不能將其綁定到指定的本地埠號。
SecurityException - 如果安全管理器存在並且其 checkListen 方法不允許進行該操作。
從以下版本開始:
JDK1.1
另請參見:
SecurityManager.checkListen(int)
方法詳細資訊

bind

public void bind(SocketAddress addr)
          throws SocketException
將此 DatagramSocket 綁定到特定的位址和埠號。

如果位址為 null,則系統將挑選一個臨時埠號和一個有效本地位址來綁定Socket。

參數:
addr - 要綁定的位址和埠號。
拋出:
SocketException - 如果綁定過程中發生錯誤,或者Socket已經被綁定。
SecurityException - 如果安全管理器存在並且其 checkListen 方法不允許進行該操作。
IllegalArgumentException - 如果 addr 是不受此Socket支持的 SocketAddress 子類別。
從以下版本開始:
1.4

connect

public void connect(InetAddress address,
                    int port)
將Socket連接到此Socket的遠端位址。當Socket連接到遠端位址時,包就只能從該位址發送或接收。預設情況下不連接資料電報Socket。

如果Socket要連接的遠端目標不存在或不可到達,並且收到了該位址的目標不可達 ICMP 套件,那麼後續發送和接收的調用可能會拋出 PortUnreachableException。注意,不能保證一定拋出該異常。

在連接時檢查調用者對給定主機和埠號的發送和接收資料電報權限。當連接建立起來後,接收和發送除了對包和Socket的位址和埠號進行比對外,對傳入和傳出的套件將不再執行任何安全性檢查。對於發送操作,如果設置了套件的位址並且套件的位址和Socket的位址不比對,則將拋出 IllegalArgumentException。連接到多點傳送位址的Socket只能用於發送套件。

參數:
address - Socket的遠端位址。
port - Socket的遠端埠號。
拋出:
IllegalArgumentException - 如果位址為 null,或埠號超出了範圍。
SecurityException - 如果不允許調用者向此位址和埠號發送也不允許從此位址接收資料電報。
另請參見:
disconnect(), send(java.net.DatagramPacket), receive(java.net.DatagramPacket)

connect

public void connect(SocketAddress addr)
             throws SocketException
將此Socket連接到遠端Socket位址(IP 位址 + 埠號號)。

參數:
addr - 遠端位址。
拋出:
SocketException - 如果連接失敗
IllegalArgumentException - 如果 addr 為 null 或者 addr 是不受此Socket支持的 SocketAddress 子類別。
從以下版本開始:
1.4
另請參見:
connect(java.net.InetAddress, int)

disconnect

public void disconnect()
斷開Socket的連接。如果Socket沒有連接,則此方法不執行任何操作。

另請參見:
connect(java.net.InetAddress, int)

isBound

public boolean isBound()
返回Socket的綁定狀態。

返回:
如果將Socket成功地綁定到一個位址,則返回 true
從以下版本開始:
1.4

isConnected

public boolean isConnected()
返回Socket的連接狀態。

返回:
如果將Socket成功地連接到伺服器,則為 true。
從以下版本開始:
1.4

getInetAddress

public InetAddress getInetAddress()
返回此Socket連接的位址。如果Socket未連接,則返回 null。

返回:
此Socket連接的位址。

getPort

public int getPort()
返回此Socket的埠號。如果Socket未連接,則返回 -1。

返回:
此Socket連接的埠號。

getRemoteSocketAddress

public SocketAddress getRemoteSocketAddress()
返回此Socket連接的端點的位址,如果未連接則返回 null

返回:
表示此Socket遠端端點的 SocketAddress,如果尚未連接則返回 null
從以下版本開始:
1.4
另請參見:
getInetAddress(), getPort(), connect(SocketAddress)

getLocalSocketAddress

public SocketAddress getLocalSocketAddress()
返回此Socket綁定的端點的位址,如果尚未綁定則返回 null

返回:
表示此Socket的本地端點的 SocketAddress,如果尚未綁定則返回 null
從以下版本開始:
1.4
另請參見:
getLocalAddress(), getLocalPort(), bind(SocketAddress)

send

public void send(DatagramPacket p)
          throws IOException
從此Socket發送資料電報封包。DatagramPacket 套件含的資訊指示:將要發送的資料、其長度、遠端主機的 IP 位址和遠端主機的埠號號。

如果存在安全管理器,且Socket當前沒有連接到遠端位址,則此方法首先執行某些安全性檢查。首先,如果 p.getAddress().isMulticastAddress() 為 true,則此方法以 p.getAddress() 作為參數調用安全管理器的 checkMulticast 方法。如果該表達式的值為 false,此方法改為調用安全管理器的以 p.getAddress().getHostAddress()p.getPort() 為參數的 checkConnect 方法。如果不允許該操作,則每次調用安全管理器方法都會導致 SecurityException。

參數:
p - 將要發送的 DatagramPacket
拋出:
IOException - 如果發生 I/O 錯誤。
SecurityException - 如果安全管理器存在並且其 checkMulticastcheckConnect 方法不允許進行發送。
PortUnreachableException - Socket連接到當前不可達的目標時可能拋出。注意,不能保證一定拋出該異常。
IllegalBlockingModeException - 如果此Socket具有相關聯的通道,且通道處於非阻塞網要。
另請參見:
DatagramPacket, SecurityManager.checkMulticast(InetAddress), SecurityManager.checkConnect(java.lang.String, int)

receive

public void receive(DatagramPacket p)
             throws IOException
從此Socket接收資料電報封包。當此方法返回時,DatagramPacket 的緩衝區填充了接收的資料。資料電報封包也包含發送方的 IP 位址和發送方機器上的埠號號。

此方法在接收到資料電報前一直阻塞。資料電報封包物件的 length 欄位包含所接收資訊的長度。如果資訊比套件的長度長,該資訊將被截短。

如果存在安全管理器,而安全管理器的 checkAccept 方法不允許接收操作,則包不能被接收。

參數:
p - 要放置傳入資料的 DatagramPacket
拋出:
IOException - 如果發生 I/O 錯誤。
SocketTimeoutException - 如果先前調用了 setSoTimeout 且逾時值已過。
PortUnreachableException - Socket連接到當前不可達的目標時可能拋出。注意,不能保證一定拋出該異常。
IllegalBlockingModeException - 如果此Socket具有相關聯的通道,且通道處於非阻塞網要。
另請參見:
DatagramPacket, DatagramSocket

getLocalAddress

public InetAddress getLocalAddress()
獲取Socket綁定的本地位址。

如果存在安全管理器,則首先使用主機位址和 -1 作為參數調用其 checkConnect 方法,以查看是否允許該操作。

返回:
Socket綁定的本地位址,如果Socket沒有綁定或安全管理器的 checkConnect 方法不允許該操作,則返回表示任何本地位址的 InetAddress
另請參見:
SecurityManager.checkConnect(java.lang.String, int)

getLocalPort

public int getLocalPort()
返回此Socket綁定的本地主機上的埠號號。

返回:
此Socket綁定的本地主機上的埠號。

setSoTimeout

public void setSoTimeout(int timeout)
                  throws SocketException
啟用/禁用帶有指定逾時值的 SO_TIMEOUT,以毫秒為單位。將此選項設為非零的逾時值時,對此 DatagramSocket 調用 receive() 將只阻塞此時間長度。如果超過逾時值,將引發 java.net.SocketTimeoutException,雖然 DatagramSocket 仍舊有效。選項必須在進入阻塞操作前被啟用才能生效。逾時值必須是 > 0 的數。逾時值為 0 被解釋為無窮大逾時值。

參數:
timeout - 指定的以毫秒為單位的逾時值。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。
從以下版本開始:
JDK1.1
另請參見:
getSoTimeout()

getSoTimeout

public int getSoTimeout()
                 throws SocketException
獲取 SO_TIMEOUT 的設置。返回 0 意味著禁用了選項(即無窮大的逾時值)。

返回:
SO_TIMEOUT 的設置。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。
從以下版本開始:
JDK1.1
另請參見:
setSoTimeout(int)

setSendBufferSize

public void setSendBufferSize(int size)
                       throws SocketException
將此 DatagramSocket 的 SO_SNDBUF 選項設置為指定的值。網路實作使用 SO_SNDBUF 選項作為設置底層網路 I/O 緩衝區大小的提示。網路實作也可以使用 SO_SNDBUF 設置來決定在此Socket上可以傳送的套件的最大大小。

由於 SO_SNDBUF 是一種提示,想要驗證緩衝區大小的應用程序應該調用 getSendBufferSize()

當發送率很高時,增大緩衝區的大小可以允許網路實作對多個傳出包進行排隊。

註:如果使用 send(DatagramPacket) 來發送比 SO_SNDBUF 設置大的 DatagramPacket,套件是被發送還是被丟棄是特定於實作的。

參數:
size - 將設置的發送緩衝區大小。此值必須大於 0。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。
IllegalArgumentException - 如果值為 0 或負。
另請參見:
getSendBufferSize()

getSendBufferSize

public int getSendBufferSize()
                      throws SocketException
獲取此 DatagramSocket 的 SO_SNDBUF 選項的值,該值是平臺在 DatagramSocket 上輸出時使用的緩衝區大小。

返回:
DatagramSocket 的 SO_SNDBUF 選項的值。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。
另請參見:
setSendBufferSize(int)

setReceiveBufferSize

public void setReceiveBufferSize(int size)
                          throws SocketException
將此 DatagramSocket 的 SO_RCVBUF 選項設置為指定的值。網路實作使用 SO_RCVBUF 選項作為設置底層網路 I/O 緩衝區大小的提示。網路實作也可以使用 SO_RCVBUF 設置來決定在此Socket上可以接收的套件的最大大小。

由於 SO_RCVBUF 是一種提示,想要驗證緩衝區設置大小的應用程序應該調用 getReceiveBufferSize()

當包到達的速度快於使用 receive(DatagramPacket) 接收套件的速度時,增大 SO_RCVBUF 可以允許網路實作快取記憶體多個套件。

註:是否能接收大於 SO_RCVBUF 的套件是特定於實作的。

參數:
size - 要設置的接收緩衝區大小。此值必須大於 0。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。
IllegalArgumentException - 如果值為 0 或負。
另請參見:
getReceiveBufferSize()

getReceiveBufferSize

public int getReceiveBufferSize()
                         throws SocketException
獲取此 DatagramSocket 的 SO_RCVBUF 選項的值,該值是平臺在 DatagramSocket 上輸入時使用的緩衝區大小。

返回:
DatagramSocket 的 SO_RCVBUF 選項的值。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。
另請參見:
setReceiveBufferSize(int)

setReuseAddress

public void setReuseAddress(boolean on)
                     throws SocketException
啟用/禁用 SO_REUSEADDR Socket選項。

對於 UDP Socket可能有必要把超過一個的Socket綁定到相同的Socket位址。這樣做的目的通常是為了接收多點傳送套件。(請參閱 MulticastSocket)。如果在使用 bind(SocketAddress) 綁定Socket之前啟用 SO_REUSEADDR Socket選項,則 SO_REUSEADDR Socket選項允許將多個Socket綁定到相同的套結字位址。

注意:所有現有平臺都不支持此功能,因此不管是否將忽略此選項,它都是特定於實作的。但是,如果此功能不受支持,則 getReuseAddress() 將始終返回 false

當創建 DatagramSocket 時,禁用 SO_REUSEADDR 的初始設置。

在綁定Socket(請參閱 isBound())後啟用或禁用 SO_REUSEADDR 時的行為是不確定的。

參數:
on - 是否啟用 SO_REUSEADDR Socket選項
拋出:
如果啟用或禁用 - SO_RESUEADDR Socket選項時發生錯誤,或者關閉了Socket。
SocketException
從以下版本開始:
1.4
另請參見:
getReuseAddress(), bind(SocketAddress), isBound(), isClosed()

getReuseAddress

public boolean getReuseAddress()
                        throws SocketException
檢測是否啟用了 SO_REUSEADDR。

返回:
指示是否啟用 SO_REUSEADDR 的 boolean 值。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。
從以下版本開始:
1.4
另請參見:
setReuseAddress(boolean)

setBroadcast

public void setBroadcast(boolean on)
                  throws SocketException
啟用/禁用 SO_BROADCAST。

參數:
on - 是否開啟廣播。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。
從以下版本開始:
1.4
另請參見:
getBroadcast()

getBroadcast

public boolean getBroadcast()
                     throws SocketException
檢測是否啟用了 SO_BROADCAST。

返回:
指示是否啟用 SO_BROADCAST 的 boolean 值。
拋出:
SocketException - 如果底層協議出現錯誤,例如 UDP 錯誤。
從以下版本開始:
1.4
另請參見:
setBroadcast(boolean)

setTrafficClass

public void setTrafficClass(int tc)
                     throws SocketException
為從此 DatagramSocket 上發送的資料電報在 IP 資料電報頭中設置串流量類別別 (traffic class) 或服務型別八位組 (type-of-service octet)。由於底層網路實作可能忽略此值,應用程序應該將其視為一種提示。

tc 的值必須 0 <= tc <= 255 範圍內,否則將拋出 IllegalArgumentException。

註:

對於 Internet Protocol v4 該值由包含優先級和 TOS 欄位的八位組組成,這在 RFC 1349 中有詳細敘述。TOS 欄位是由以下逐位或所得值創建的位集:

末尾的最低位常常被忽略,因為該位對應於 MBZ(必須為 0)位。

設置優先級欄位中的位可能導致 SocketException,指示不允許該操作。

對於 Internet Protocol v6 tc 是將被放置到 IP 頭部的 sin6_flowinfo 欄位中的值。

參數:
tc - 此位集的 int 值。
拋出:
SocketException - 如果設置串流量類別別或服務型別時出現錯誤
從以下版本開始:
1.4
另請參見:
getTrafficClass()

getTrafficClass

public int getTrafficClass()
                    throws SocketException
為從此 DatagramSocket 上發送的套件獲取 IP 資料電報頭中的串流量類別別或服務型別。

由於底層網路實作可能忽略使用 setTrafficClass(int) 設置的串流量類別別或服務型別,因而此方法可能返回一個不同於以前用 setTrafficClass(int) 在此 DatagramSocket 上設置的值。

返回:
已經設置的串流量類別別或服務型別
拋出:
SocketException - 如果獲得串流量類別別或服務型別值時出現錯誤。
從以下版本開始:
1.4
另請參見:
setTrafficClass(int)

close

public void close()
關閉此資料電報Socket。

在此Socket上 receive(java.net.DatagramPacket) 中所有當前阻塞的執行緒將會拋出 SocketException

如果此Socket有一個與之關聯的通道,則關閉該通道。


isClosed

public boolean isClosed()
返回是否關閉了Socket。

返回:
如果已經關閉了Socket,則返回 true
從以下版本開始:
1.4

getChannel

public DatagramChannel getChannel()
返回與此資料電報Socket關聯的唯一 DatagramChannel 物件(如果有)。

當且僅當通過 DatagramChannel.open 方法創建了通道本身時,資料電報Socket才具有一個通道。

返回:
與此資料電報Socket關聯的資料電報通道,如果沒有為通道創建Socket,則返回 null
從以下版本開始:
1.4

setDatagramSocketImplFactory

public static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac)
                                         throws IOException
為應用程序設置資料電報Socket實作處理器。處理器只能指定一次。

當應用程序創建新的資料電報Socket時,調用Socket實作處理器的 createDatagramSocketImpl 方法創建實際的資料電報Socket實作。

除非已經設置了處理器,否則向該方法傳遞 null 是無操作。

如果存在安全管理器,此方法首先調用安全管理器的 checkSetFactory 方法,確保允許該操作。這可能會導致 SecurityException 異常。

參數:
fac - 所需的處理器。
拋出:
IOException - 如果設置資料電報Socket處理器時發生 I/O 錯誤。
SocketException - 如果已經定義該處理器。
SecurityException - 如果安全管理器存在並且其 checkSetFactory 方法不允許進行該操作。
從以下版本開始:
1.3
另請參見:
DatagramSocketImplFactory.createDatagramSocketImpl(), SecurityManager.checkSetFactory()

JavaTM 2 Platform
Standard Ed. 6

提交錯誤或意見

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