|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object java.net.DatagramSocket
public class DatagramSocket
此類別表示用來發送和接收資料電報封包的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。
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 |
建構子詳細資訊 |
---|
public DatagramSocket() throws SocketException
如果有安全管理器,則首先使用 0 作為變數來調用其 checkListen
方法,以確保允許該操作。這可能會導致 SecurityException 異常。
SocketException
- 如果Socket不能被打開,或不能將其綁定到指定的本地埠號。
SecurityException
- 如果安全管理器存在並且其 checkListen
方法不允許進行該操作。SecurityManager.checkListen(int)
protected DatagramSocket(DatagramSocketImpl impl)
impl
- 子類別希望在 DatagramSocket 上使用的 DatagramSocketImpl 的實例。public DatagramSocket(SocketAddress bindaddr) throws SocketException
如果位址為 null
,創建未綁定的Socket。
如果有安全管理器,則首先使用Socket中的埠號作為變數來調用其 checkListen
方法,以確保允許該操作。這可能會導致 SecurityException 異常。
bindaddr
- 要綁定的本地Socket位址,對於未綁定的Socket為 null
。
SocketException
- 如果Socket不能被打開,或不能將其綁定到指定的本地埠號。
SecurityException
- 如果安全管理器存在並且其 checkListen
方法不允許進行該操作。SecurityManager.checkListen(int)
public DatagramSocket(int port) throws SocketException
如果存在安全管理器,則首先使用 port
參數作為參數調用其 checkListen
方法,以確保允許該操作。這可能會導致 SecurityException 異常。
port
- 要使用的埠號。
SocketException
- 如果Socket不能被打開,或不能將其綁定到指定的本地埠號。
SecurityException
- 如果安全管理器存在並且其 checkListen
方法不允許進行該操作。SecurityManager.checkListen(int)
public DatagramSocket(int port, InetAddress laddr) throws SocketException
如果存在安全管理器,則首先使用 port
參數作為參數調用其 checkListen
方法,以確保允許該操作。這可能會導致 SecurityException 異常。
port
- 要使用的本地埠號laddr
- 要綁定的本地位址
SocketException
- 如果Socket不能被打開,或不能將其綁定到指定的本地埠號。
SecurityException
- 如果安全管理器存在並且其 checkListen
方法不允許進行該操作。SecurityManager.checkListen(int)
方法詳細資訊 |
---|
public void bind(SocketAddress addr) throws SocketException
如果位址為 null
,則系統將挑選一個臨時埠號和一個有效本地位址來綁定Socket。
addr
- 要綁定的位址和埠號。
SocketException
- 如果綁定過程中發生錯誤,或者Socket已經被綁定。
SecurityException
- 如果安全管理器存在並且其 checkListen
方法不允許進行該操作。
IllegalArgumentException
- 如果 addr 是不受此Socket支持的 SocketAddress 子類別。public void connect(InetAddress address, int port)
如果Socket要連接的遠端目標不存在或不可到達,並且收到了該位址的目標不可達 ICMP 套件,那麼後續發送和接收的調用可能會拋出 PortUnreachableException。注意,不能保證一定拋出該異常。
在連接時檢查調用者對給定主機和埠號的發送和接收資料電報權限。當連接建立起來後,接收和發送除了對包和Socket的位址和埠號進行比對外,對傳入和傳出的套件將不再執行任何安全性檢查。對於發送操作,如果設置了套件的位址並且套件的位址和Socket的位址不比對,則將拋出 IllegalArgumentException。連接到多點傳送位址的Socket只能用於發送套件。
address
- Socket的遠端位址。port
- Socket的遠端埠號。
IllegalArgumentException
- 如果位址為 null,或埠號超出了範圍。
SecurityException
- 如果不允許調用者向此位址和埠號發送也不允許從此位址接收資料電報。disconnect()
,
send(java.net.DatagramPacket)
,
receive(java.net.DatagramPacket)
public void connect(SocketAddress addr) throws SocketException
addr
- 遠端位址。
SocketException
- 如果連接失敗
IllegalArgumentException
- 如果 addr 為 null 或者 addr 是不受此Socket支持的 SocketAddress 子類別。connect(java.net.InetAddress, int)
public void disconnect()
connect(java.net.InetAddress, int)
public boolean isBound()
public boolean isConnected()
public InetAddress getInetAddress()
public int getPort()
public SocketAddress getRemoteSocketAddress()
null
。
SocketAddress
,如果尚未連接則返回 null
。getInetAddress()
,
getPort()
,
connect(SocketAddress)
public SocketAddress getLocalSocketAddress()
null
。
SocketAddress
,如果尚未綁定則返回 null
。getLocalAddress()
,
getLocalPort()
,
bind(SocketAddress)
public void send(DatagramPacket p) throws IOException
DatagramPacket
套件含的資訊指示:將要發送的資料、其長度、遠端主機的 IP 位址和遠端主機的埠號號。
如果存在安全管理器,且Socket當前沒有連接到遠端位址,則此方法首先執行某些安全性檢查。首先,如果 p.getAddress().isMulticastAddress()
為 true,則此方法以 p.getAddress()
作為參數調用安全管理器的 checkMulticast
方法。如果該表達式的值為 false,此方法改為調用安全管理器的以 p.getAddress().getHostAddress()
和 p.getPort()
為參數的 checkConnect
方法。如果不允許該操作,則每次調用安全管理器方法都會導致 SecurityException。
p
- 將要發送的 DatagramPacket
。
IOException
- 如果發生 I/O 錯誤。
SecurityException
- 如果安全管理器存在並且其 checkMulticast
或 checkConnect
方法不允許進行發送。
PortUnreachableException
- Socket連接到當前不可達的目標時可能拋出。注意,不能保證一定拋出該異常。
IllegalBlockingModeException
- 如果此Socket具有相關聯的通道,且通道處於非阻塞網要。DatagramPacket
,
SecurityManager.checkMulticast(InetAddress)
,
SecurityManager.checkConnect(java.lang.String, int)
public void receive(DatagramPacket p) throws IOException
DatagramPacket
的緩衝區填充了接收的資料。資料電報封包也包含發送方的 IP 位址和發送方機器上的埠號號。
此方法在接收到資料電報前一直阻塞。資料電報封包物件的 length
欄位包含所接收資訊的長度。如果資訊比套件的長度長,該資訊將被截短。
如果存在安全管理器,而安全管理器的 checkAccept
方法不允許接收操作,則包不能被接收。
p
- 要放置傳入資料的 DatagramPacket
。
IOException
- 如果發生 I/O 錯誤。
SocketTimeoutException
- 如果先前調用了 setSoTimeout 且逾時值已過。
PortUnreachableException
- Socket連接到當前不可達的目標時可能拋出。注意,不能保證一定拋出該異常。
IllegalBlockingModeException
- 如果此Socket具有相關聯的通道,且通道處於非阻塞網要。DatagramPacket
,
DatagramSocket
public InetAddress getLocalAddress()
如果存在安全管理器,則首先使用主機位址和 -1
作為參數調用其 checkConnect
方法,以查看是否允許該操作。
checkConnect
方法不允許該操作,則返回表示任何本地位址的 InetAddress
。SecurityManager.checkConnect(java.lang.String, int)
public int getLocalPort()
public void setSoTimeout(int timeout) throws SocketException
timeout
- 指定的以毫秒為單位的逾時值。
SocketException
- 如果底層協議出現錯誤,例如 UDP 錯誤。getSoTimeout()
public int getSoTimeout() throws SocketException
SocketException
- 如果底層協議出現錯誤,例如 UDP 錯誤。setSoTimeout(int)
public void setSendBufferSize(int size) throws SocketException
由於 SO_SNDBUF 是一種提示,想要驗證緩衝區大小的應用程序應該調用 getSendBufferSize()
。
當發送率很高時,增大緩衝區的大小可以允許網路實作對多個傳出包進行排隊。
註:如果使用 send(DatagramPacket)
來發送比 SO_SNDBUF 設置大的 DatagramPacket
,套件是被發送還是被丟棄是特定於實作的。
size
- 將設置的發送緩衝區大小。此值必須大於 0。
SocketException
- 如果底層協議出現錯誤,例如 UDP 錯誤。
IllegalArgumentException
- 如果值為 0 或負。getSendBufferSize()
public int getSendBufferSize() throws SocketException
SocketException
- 如果底層協議出現錯誤,例如 UDP 錯誤。setSendBufferSize(int)
public void setReceiveBufferSize(int size) throws SocketException
由於 SO_RCVBUF 是一種提示,想要驗證緩衝區設置大小的應用程序應該調用 getReceiveBufferSize()
。
當包到達的速度快於使用 receive(DatagramPacket)
接收套件的速度時,增大 SO_RCVBUF 可以允許網路實作快取記憶體多個套件。
註:是否能接收大於 SO_RCVBUF 的套件是特定於實作的。
size
- 要設置的接收緩衝區大小。此值必須大於 0。
SocketException
- 如果底層協議出現錯誤,例如 UDP 錯誤。
IllegalArgumentException
- 如果值為 0 或負。getReceiveBufferSize()
public int getReceiveBufferSize() throws SocketException
SocketException
- 如果底層協議出現錯誤,例如 UDP 錯誤。setReceiveBufferSize(int)
public void setReuseAddress(boolean on) throws SocketException
對於 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
getReuseAddress()
,
bind(SocketAddress)
,
isBound()
,
isClosed()
public boolean getReuseAddress() throws SocketException
boolean
值。
SocketException
- 如果底層協議出現錯誤,例如 UDP 錯誤。setReuseAddress(boolean)
public void setBroadcast(boolean on) throws SocketException
on
- 是否開啟廣播。
SocketException
- 如果底層協議出現錯誤,例如 UDP 錯誤。getBroadcast()
public boolean getBroadcast() throws SocketException
boolean
值。
SocketException
- 如果底層協議出現錯誤,例如 UDP 錯誤。setBroadcast(boolean)
public void setTrafficClass(int tc) throws SocketException
tc 的值必須在 0 <= tc <= 255
範圍內,否則將拋出 IllegalArgumentException。
註:
對於 Internet Protocol v4 該值由包含優先級和 TOS 欄位的八位組組成,這在 RFC 1349 中有詳細敘述。TOS 欄位是由以下逐位或所得值創建的位集:
IPTOS_LOWCOST (0x02)
IPTOS_RELIABILITY (0x04)
IPTOS_THROUGHPUT (0x08)
IPTOS_LOWDELAY (0x10)
設置優先級欄位中的位可能導致 SocketException,指示不允許該操作。
對於 Internet Protocol v6 tc
是將被放置到 IP 頭部的 sin6_flowinfo 欄位中的值。
tc
- 此位集的 int
值。
SocketException
- 如果設置串流量類別別或服務型別時出現錯誤getTrafficClass()
public int getTrafficClass() throws SocketException
由於底層網路實作可能忽略使用 setTrafficClass(int)
設置的串流量類別別或服務型別,因而此方法可能返回一個不同於以前用 setTrafficClass(int)
在此 DatagramSocket 上設置的值。
SocketException
- 如果獲得串流量類別別或服務型別值時出現錯誤。setTrafficClass(int)
public void close()
在此Socket上 receive(java.net.DatagramPacket)
中所有當前阻塞的執行緒將會拋出 SocketException
。
如果此Socket有一個與之關聯的通道,則關閉該通道。
public boolean isClosed()
public DatagramChannel getChannel()
DatagramChannel
物件(如果有)。
當且僅當通過 DatagramChannel.open
方法創建了通道本身時,資料電報Socket才具有一個通道。
public static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac) throws IOException
當應用程序創建新的資料電報Socket時,調用Socket實作處理器的 createDatagramSocketImpl
方法創建實際的資料電報Socket實作。
除非已經設置了處理器,否則向該方法傳遞 null
是無操作。
如果存在安全管理器,此方法首先調用安全管理器的 checkSetFactory
方法,確保允許該操作。這可能會導致 SecurityException 異常。
fac
- 所需的處理器。
IOException
- 如果設置資料電報Socket處理器時發生 I/O 錯誤。
SocketException
- 如果已經定義該處理器。
SecurityException
- 如果安全管理器存在並且其 checkSetFactory
方法不允許進行該操作。DatagramSocketImplFactory.createDatagramSocketImpl()
,
SecurityManager.checkSetFactory()
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。