一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

java Socket用法詳解 Socket的構造方法有以下幾種重載形式

來源:CSDN 時間:2022-12-23 09:58:57

在客戶/服務器通信模式中, 客戶端需要主動創(chuàng)建與服務器連接的 Socket(套接字), 服務器端收到了客戶端的連接請求, 也會創(chuàng)建與客戶連接的 Socket. Socket可看做是通信連接兩端的收發(fā)器, 服務器與客戶端都通過 Socket 來收發(fā)數據.

這篇文章首先介紹Socket類的各個構造方法, 以及成員方法的用法, 接著介紹 Socket的一些選項的作用, 這些選項可控制客戶建立與服務器的連接, 以及接收和發(fā)送數據的行為.

一. 構造Socket


(資料圖片僅供參考)

Socket的構造方法有以下幾種重載形式:

Socket()  Socket(InetAddress address, int port) throws UnknowHostException, IOException  Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException  Socket(String host, int port) throws UnknowHostException, IOException  Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException  除了第一個不帶參數的構造方法以外, 其他構造方法都會試圖建立與服務器的連接, 如果連接成功, 就返回 Socket對象; 如果因為某些原因連接失敗, 就會拋出IOException .

1.1 使用無參數構造方法, 設定等待建立連接的超時時間

Socket socket = new Socket(); SocketAddress remoteAddr = new InetSocketAddress("localhost",8000); socket.connect(remoteAddr, 60000); //等待建立連接的超時時間為1分鐘

以上代碼用于連接到本地機器上的監(jiān)聽8000端口的服務器程序, 等待連接的最長時間為1分鐘. 如果在1分鐘內連接成功則connet()方法順利返回; 如果在1分鐘內出現某種異常, 則拋出該異常; 如果超過1分鐘后, 即沒有連接成功, 也沒有出現其他異常, 那么會拋出 SocketTimeoutException. Socket 類的 connect(SocketAddress endpoint, int timeout) 方法負責連接服務器, 參數endpoint 指定服務器的地址, 參數timeout 設定超時數據, 以毫秒為單位. 如果參數timeout 設為0, 表示永遠不會超時, 默認是不會超時的.

1.2 設定服務器的地址

除了第一個不帶參數的構造方法, 其他構造方法都需要在參數中設定服務器的地址, 包括服務器的IP地址或主機名, 以及端口:

Socket(InetAddress address, int port)              //第一個參數address 表示主機的IP地址 Socket(String host, int port)                              //第一個參數host 表示主機的名字

InetAddress 類表示服務器的IP地址, InetAddress 類提供了一系列靜態(tài)工廠方法, 用于構造自身的實例, 例如:

//返回本地主機的IP地址 InetAddress addr1 = InetAddress.getLocalHost(); //返回代表 "222.34.5.7"的 IP地址 InetAddress addr2 = InetAddress.getByName("222.34.5.7"); //返回域名為"www.javathinker.org"的 IP地址 InetAddress addr3 = InetAddress.getByName("www.javathinker.org");

1.3 設定客戶端的地址

在一個Socket 對象中, 即包含遠程服務器的IP 地址和端口信息, 也包含本地客戶端的IP 地址和端口信息. 默認情況下, 客戶端的IP 地址來自于客戶程序所在的主機, 客戶端的端口則由操作系統隨機分配. Socket類還有兩個構造方法允許顯式地設置客戶端的IP 地址和端口:

//參數localAddr 和 localPort 用來設置客戶端的IP 地址和端口 Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException

如果一個主機同時屬于兩個以上的網絡, 它就可能擁有兩個以上的IP 地址. 例如, 一個主機在Internet 網絡中的IP 地址為 "222.67.1.34", 在一個局域網中的IP 地址為 "112.5.4.3". 假定這個主機上的客戶程序希望和同一個局域網的一個服務器程序(地址為:"112.5.4.45: 8000")通信, 客戶端可按照如下方式構造Socket 對象:

InetAddress remoteAddr1 = InetAddress.getByName("112.5.4.45"); InetAddress localAddr1 = InetAddress.getByName("112.5.4.3"); Socket socket1 = new Socket(remoteAddr1, 8000, localAddr1, 2345);   //客戶端使用端口2345

1.4 客戶連接服務器時可能拋出的異常

當Socket 的構造方法請求連接服務器時, 可能會拋出下面的異常.

UnKnownHostException: 如果無法識別主機的名字或IP 地址, 就會拋出這種異常.  ConnectException: 如果沒有服務器進程監(jiān)聽指定的端口, 或者服務器進程拒絕連接, 就會拋出這種異常.  SocketTimeoutException: 如果等待連接超時, 就會拋出這種異常.  BindException: 如果無法把Socket 對象與指定的本地IP 地址或端口綁定, 就會拋出這種異常. 以上4中異常都是IOException的直接或間接子類.      如圖2-1所示.

IOException------- UnknownHostException

|---- InterruptedIOException ----------- SocketTimeoutException

|---- SocketException              ----------- BindException

|---------- ConnectException

圖2-1 客戶端連接服務器時可能拋出的異常

二. 獲取Socket 的信息

在一個Socket 對象中同時包含了遠程服務器的IP 地址和端口信息, 以及客戶本地的IP 地址和端口信息. 此外, 從Socket 對象中還可以獲得輸出流和輸入流, 分別用于向服務器發(fā)送數據, 以及接收從服務器端發(fā)來的數據. 以下方法用于獲取Socket的有關信息.

getInetAddress(): 獲得遠程服務器的IP 地址.  getPort(): 獲得遠程服務器的端口.  getLocalAddress(): 獲得客戶本地的IP 地址.  getLocalPort(): 獲得客戶本地的端口.  getInputStream(): 獲得輸入流. 如果Socket 還沒有連接, 或者已經關閉, 或者已經通過 shutdownInput() 方法關閉輸入流, 那么此方法會拋出IOException.  getOutputStream(): 獲得輸出流, 如果Socket 還沒有連接, 或者已經關閉, 或者已經通過 shutdownOutput() 方法關閉輸出流, 那么此方法會拋出IOException.  這里有個HTTPClient 類的例子, 代碼我是寫好了, 也測試過了, 因為篇幅原因就不貼了. 這個HTTPClient 類用于訪問網頁 www.javathinker.org/index.jsp. 該網頁位于一個主機名(也叫域名)為 www.javathinker.org 的遠程HTTP服務器上, 它監(jiān)聽 80 端口. 在HTTPClient 類中, 先創(chuàng)建了一個連接到該HTTP服務器的Socket對象, 然后發(fā)送符合HTTP 協議的請求, 接著接收從HTTP 服務器上發(fā)回的響應結果.

三. 關閉Socket

當客戶與服務器的通信結束, 應該及時關閉Socket , 以釋放Socket 占用的包括端口在內的各種資源. Socket 的 close() 方法負責關閉Socket. 當一個Socket對象被關閉, 就不能再通過它的輸入流和輸出流進行I/O操作, 否則會導致IOException.

為了確保關閉Socket 的操作總是被執(zhí)行, 強烈建議把這個操作放在finally 代碼塊中:

Socket socket = null; try{socket = new Socket(www.javathinker.org,80); //執(zhí)行接收和發(fā)送數據的操作 .......... }catch(IOException e){e.printStackTrace(); }finally{try{if(socket != null) socket.close(); }catch(IOException e){e.printStackTrace();} }

Socket 類提供了3 個狀態(tài)測試方法.

isClosed(): 如果Socket已經連接到遠程主機, 并且還沒有關閉, 則返回true , 否則返回false .  isConnected(): 如果Socket曾經連接到遠程主機, 則返回true , 否則返回false .  isBound(): 如果Socket已經與一個本地端口綁定, 則返回true , 否則返回false .  如果要判斷一個Socket 對象當前是否處于連接狀態(tài), 可采用以下方式:

boolean isConnected = socket.isConnected() && !socket.isClosed();

四. 半關閉Socket

進程A 與進程B 通過Socket 通信, 假定進程A 輸出數據, 進程B 讀入數據. 進程A 如何告訴進程B 所有數據已經輸出完畢? 下文略......

五. 設置Socket 的選項

Socket 有以下幾個選項.

TCP_NODELAY: 表示立即發(fā)送數據.  SO_RESUSEADDR: 表示是否允許重用Socket 所綁定的本地地址.  SO_TIMEOUT: 表示接收數據時的等待超時數據.  SO_LINGER: 表示當執(zhí)行Socket 的 close()方法時, 是否立即關閉底層的Socket.  SO_SNFBUF: 表示發(fā)送數據的緩沖區(qū)的大小.  SO_RCVBUF: 表示接收數據的緩沖區(qū)的大小.  SO_KEEPALIVE: 表示對于長時間處于空閑狀態(tài)的Socket , 是否要自動把它關閉.  OOBINLINE: 表示是否支持發(fā)送一個字節(jié)的TCP 緊急數據.  5.1 TCP_NODELAY 選項

設置該選項: public void setTcpNoDelay(boolean on) throws SocketException  讀取該選項: public boolean getTcpNoDelay() throws SocketException  默認情況下, 發(fā)送數據采用Negale 算法. Negale 算法是指發(fā)送方發(fā)送的數據不會立即發(fā)出, 而是先放在緩沖區(qū), 等緩存區(qū)滿了再發(fā)出. 發(fā)送完一批數據后, 會等待接收方對這批數據的回應, 然后再發(fā)送下一批數據. Negale 算法適用于發(fā)送方需要發(fā)送大批量數據, 并且接收方會及時作出回應的場合, 這種算法通過減少傳輸數據的次數來提高通信效率.

如果發(fā)送方持續(xù)地發(fā)送小批量的數據, 并且接收方不一定會立即發(fā)送響應數據, 那么Negale 算法會使發(fā)送方運行很慢. 對于GUI 程序, 如網絡游戲程序(服務器需要實時跟蹤客戶端鼠標的移動), 這個問題尤其突出. 客戶端鼠標位置改動的信息需要實時發(fā)送到服務器上, 由于Negale 算法采用緩沖, 大大減低了實時響應速度, 導致客戶程序運行很慢.

TCP_NODELAY 的默認值為 false, 表示采用 Negale 算法. 如果調用setTcpNoDelay(true)方法, 就會關閉 Socket的緩沖, 確保數據及時發(fā)送:

if(!socket.getTcpNoDelay()) socket.setTcpNoDelay(true);

如果Socket 的底層實現不支持TCP_NODELAY 選項, 那么getTcpNoDelay() 和 setTcpNoDelay 方法會拋出 SocketException.

5.2 SO_RESUSEADDR 選項

設置該選項: public void setResuseAddress(boolean on) throws SocketException  讀取該選項: public boolean getResuseAddress() throws SocketException  當接收方通過Socket 的close() 方法關閉Socket 時, 如果網絡上還有發(fā)送到這個Socket 的數據, 那么底層的Socket 不會立即釋放本地端口, 而是會等待一段時間, 確保接收到了網絡上發(fā)送過來的延遲數據, 然后再釋放端口. Socket接收到延遲數據后, 不會對這些數據作任何處理. Socket 接收延遲數據的目的是, 確保這些數據不會被其他碰巧綁定到同樣端口的新進程接收到.

客戶程序一般采用隨機端口, 因此出現兩個客戶程序綁定到同樣端口的可能性不大. 許多服務器程序都使用固定的端口. 當服務器程序關閉后, 有可能它的端口還會被占用一段時間, 如果此時立刻在同一個主機上重啟服務器程序, 由于端口已經被占用, 使得服務器程序無法綁定到該端口, 啟動失敗. (第三篇文章會對此作出介紹).

為了確保一個進程關閉Socket 后, 即使它還沒釋放端口, 同一個主機上的其他進程還可以立即重用該端口, 可以調用Socket 的setResuseAddress(true) 方法:

if(!socket.getResuseAddress()) socket.setResuseAddress(true);

值得注意的是 socket.setResuseAddress(true) 方法必須在 Socket 還沒有綁定到一個本地端口之前調用, 否則執(zhí)行 socket.setResuseAddress(true) 方法無效. 因此必須按照以下方式創(chuàng)建Socket 對象, 然后再連接遠程服務器:

Socket socket = new Socket();            //此時Socket對象未綁定本地端口,并且未連接遠程服務器 socket.setReuseAddress(true); SocketAddress remoteAddr = new InetSocketAddress("localhost",8000); socket.connect(remoteAddr);              //連接遠程服務器, 并且綁定匿名的本地端口

或者:

Socket socket = new Socket();              //此時Socke 對象為綁定本地端口, 并且未連接遠程服務器 socket.setReuseAddress(true); SocketAddress localAddr = new InetSocketAddress("localhost",9000); SocketAddress remoteAddr = new InetSocketAddress("localhost",8000); socket.bind(localAddr);             //與本地端口綁定 socket.connect(remoteAddr); //連接遠程服務器

此外, 兩個共用同一個端口的進程必須都調用 socket.setResuseAddress(true) 方法, 才能使得一個進程關閉 Socket后, 另一個進程的 Socket 能夠立即重用相同端口.

5.3 SO_TIMEOUT 選項

設置該選項: public void setSoTimeout(int milliseconds) throws SocketException  讀取該選項: public int getSoTimeout() throws SocketException  當通過Socket 的輸入流讀數據時, 如果還沒有數據, 就會等待. 例如, 在以下代碼中, in.read(buff) 方法從輸入流中讀入 1024個字節(jié):

byte[] buff = new byte[1024]; InputStream in = socket.getInputStream(); in.read(buff);

如果輸入流中沒有數據, in.read(buff) 就會等待發(fā)送方發(fā)送數據, 直到滿足以下情況才結束等待:

略...............

Socket 類的 SO_TIMEOUT 選項用于設定接收數據的等待超時時間, 單位為毫秒, 它的默認值為 0, 表示會無限等待, 永遠不會超時. 以下代碼把接收數據的等待超時時間設為 3 分鐘:

if(socket.getSoTimeout() == 0) socket.setSoTimeout(60000 * 3);   //注意, 原書中這里的代碼錯誤, 里面的方法名字都少了"So"

Socket 的 setSoTimeout() 方法必須在接收數據之前執(zhí)行才有效. 此外, 當輸入流的 read()方法拋出 SocketTimeoutException 后, Socket 仍然是連接的, 可以嘗試再次讀數據:

socket.setSoTimeout(180000); byte[] buff = new byte[1024]; InputStream in = socket.getInputStream(); int len = -1; do{try{len = in.read(buff); //處理讀到的數據 //......... }catch(SocketTimeoutException e){//e.printStackTrace();  System.out.println("等待讀超時!"); len = 0; }     }while(len != -1);

例子ReceiveServer.java 和 SendClient.java 是一對簡單的服務器/客戶程序. sendClient 發(fā)送字符串 "hello everyone" ,接著睡眠 1 分鐘, 然后關閉 Socket. ReceiveServer 讀取 SendClient 發(fā)送來的數據, 直到抵達輸入流的末尾, 最后打印 SendClient 發(fā)送來的數據.

ReceiveServer.java 略....... ,         SendClient.java 略..........

在 SendClient 發(fā)送字符串 "hello everyone" 后, 睡眠 1 分鐘. 當 SendClient 在睡眠時, ReceiveServer 在執(zhí)行 in.read(buff) 方法, 不能讀到足夠的數據填滿 buff 緩沖區(qū), 因此會一直等待 SendClient 發(fā)送數據. 如果在 ReceiveServer 類中 socket.setSoTimeout(20000) , 從而把等待接收數據的超時時間設為 20 秒, 那么 ReceiveServer 在等待數據時, 每當超過 20 秒, 就會拋出SocketTimeoutException . 等到 SendClient 睡眠 1 分鐘后, SendClient 調用 Socket 的 close() 方法關閉 Socket, 這意味著 ReceiveServer 讀到了輸入流的末尾, ReceiveServer 立即結束讀等待, read() 方法返回 -1 . ReceiveServer最后打印接收到的字符串 "hello everyone", 結果如下:

等待讀超時! 等待讀超時! hello everyone

5.4 SO_LINGER 選項

設置該選項: public void setSoLinger(boolean on, int seconds) throws SocketException  讀取該選項: public int getSoLinger() throws SocketException  SO_LINGER 選項用來控制 Socket 關閉時的行為. 默認情況下, 執(zhí)行 Socket 的 close() 方法, 該方法會立即返回, 但底層的 Socket 實際上并不立即關閉, 它會延遲一段時間, 直到發(fā)送完所有剩余的數據, 才會真正關閉 Socket, 斷開連接.

如果執(zhí)行以下方法:

socket.setSoLinger(true, 0);

那么執(zhí)行Socket 的close() 方法, 該方法也會立即返回, 并且底層的 Socket 也會立即關閉, 所有未發(fā)送完的剩余數據被丟棄.

如果執(zhí)行以下方法:

socket.setSoLinger(true, 3600);

那么執(zhí)行Socket 的 close() 方法, 該方法不會立即返回, 而是進入阻塞狀態(tài). 同時, 底層的 Socket 會嘗試發(fā)送剩余的數據. 只有滿足以下兩個條件之一, close() 方法才返回:

⑴ 底層的 Socket 已經發(fā)送完所有的剩余數據;

⑵ 盡管底層的 Socket 還沒有發(fā)送完所有的剩余數據, 但已經阻塞了 3600 秒(注意這里是秒, 而非毫秒), close() 方法的阻塞時間超過 3600 秒, 也會返回, 剩余未發(fā)送的數據被丟棄.

值得注意的是, 在以上兩種情況內, 當close() 方法返回后, 底層的 Socket 會被關閉, 斷開連接. 此外, setSoLinger(boolean on, int seconds) 方法中的 seconds 參數以秒為單位, 而不是以毫秒為單位.

如果未設置 SO_LINGER 選項, getSoLinger() 返回的結果是 -1, 如果設置了 socket.setSoLinger(true, 80) , getSoLinger() 返回的結果是 80.

Tips: 當程序通過輸出流寫數據時, 僅僅表示程序向網絡提交了一批數據, 由網絡負責輸送到接收方. 當程序關閉 Socket, 有可能這批數據還在網絡上傳輸, 還未到達接收方. 這里所說的 "未發(fā)送完的數據" 就是指這種還在網絡上傳輸, 未被接收方接收的數據.

例子 SimpleClient.java 與 SimpleServer.java 所示是一對簡單的客戶/服務器程序. SimpleClient 類發(fā)送一萬個字符給 SimpleServer, 然后調用Socket 的 close() 方法關閉 Socket.

SimpleServer 通過 ServerSocket 的 accept() 方法接受了 SimpleClient 的連接請求后, 并不立即接收客戶發(fā)送的數據, 而是睡眠 5 秒鐘后再接收數據. 等到 SimpleServer 開始接收數據時, SimpleClient 有可能已經執(zhí)行了 Socket 的close() 方法, 那么 SimpleServer 還能接收到 SimpleClient 發(fā)送的數據嗎?

SimpleClient.java 略..., SimpleServer.java 略......

SimpleClient.java中

System.out.println("開始關閉 Socket"); long begin = System.currentTimeMillis(); socket.close(); long end = System.currentTimeMillis(); System.out.println("關閉Socket 所用的時間為:" + (end - begin) + "ms");

下面分 3 種情況演示 SimpleClient 關閉 Socket 的行為.

⑴ 未設置 SO_LINGER 選項, 當 SimpleClient 執(zhí)行 Socket 的close() 方法時, 立即返回, SimpleClient 的打印結果如下:

開始關閉 Socket 關閉Socket 所用的時間為:0ms

等到 SimpleClient 結束運行, SimpleServer 可能才剛剛結束睡眠, 開始接收 SimpleClient 發(fā)送的數據. 此時盡管 SimpleClient 已經執(zhí)行了 Socket 的 close() 方法, 并且 SimpleClient 程序本身也運行結束了, 但從 SimpleServer 的打印結果可以看出, SimpleServer 仍然接收到了所有的數據. 之所以出現這種情況, 是因為當 SimpleClient 執(zhí)行了 Socket 的 close() 方法后, 底層的 Socket 實際上并沒有真正關閉, 與 SimpleServer 的連接依然存在. 底層的 Socket 會存在一段時間, 直到發(fā)送完所有的數據.

⑵ 設置SO_LINGER 選項, socket.setSoLinger(true, 0). 這次當 SimpleClient 執(zhí)行 Socket 的 close() 方法時, 會強行關閉底層的 Socket, 所有未發(fā)送完的數據丟失. SimpleClient 的打印結果如下:

開始關閉 Socket 關閉Socket 所用的時間為:0ms

從打印結果看出, SimpleClient 執(zhí)行 Socket 的 close() 方法時, 也立即返回. 當 SimpleServer 結束睡眠, 開始接收 SimpleClient 發(fā)送的數據時, 由于 SimpleClient 已經關閉底層 Socket, 斷開連接, 因此 SimpleServer 在讀數據時會拋出 SocketException:

java.net.SocketException: Connection reset

⑶ 設置SO_LINGER 選項, socket.setSoLinger(true, 3600). 這次當 SimpleClient 執(zhí)行 Socket 的close() 方法時, 會進入阻塞狀態(tài), 知道等待了 3600 秒, 或者底層 Socket 已經把所有未發(fā)送的剩余數據發(fā)送完畢, 才會從 close() 方法返回. SimpleClient 的打印結果如下:

開始關閉 Socket 關閉Socket 所用的時間為:5648ms

當 SimpleServer 結束了 5 秒鐘的睡眠, 開始接收 SimpleClient 發(fā)送的數據時, SimpleClient 還在這些 Socket 的close() 方法, 并且處于阻塞狀態(tài). SimpleClient 與 SimpleServer 之間的連接依然存在, 因此 SimpleServer 能夠接收到 SimpleClient 發(fā)送的所有數據.

5.5 SO_RCVBUF 選項

設置該選項: public void setReceiveBufferSize(int size) throws SocketException  讀取該選項: public int getReceiveBufferSize() throws SocketException  SO_RCVBUF 表示 Socket 的用于輸入數據的緩沖區(qū)的大小. 一般說來, 傳輸大的連續(xù)的數據塊(基于HTTP 或 FTP 協議的通信) 可以使用較大的緩沖區(qū), 這可以減少傳輸數據的次數, 提高傳輸數據的效率. 而對于交互頻繁且單次傳送數據量比較小的通信方式(Telnet 和 網絡游戲), 則應該采用小的緩沖區(qū), 確保小批量的數據能及時發(fā)送給對方. 這種設定緩沖區(qū)大小的原則也同樣適用于 Socket 的 SO_SNDBUF 選項.

如果底層 Socket 不支持 SO_RCVBUF 選項, 那么 setReceiveBufferSize() 方法會拋出 SocketException.

5.6 SO_SNDBUF 選項

設置該選項: public void setSendBufferSize(int size) throws SocketException  讀取該選項: public int getSendBufferSize() throws SocketException  SO_SNDBUF 表示 Socket 的用于輸出數據的緩沖區(qū)的大小. 如果底層 Socket 不支持 SO_SNDBUF 選項, setSendBufferSize() 方法會拋出 SocketException.

5.7 SO_KEEPALIVE 選項

設置該選項: public void setKeepAlive(boolean on) throws SocketException  讀取該選項: public boolean getKeepAlive() throws SocketException //原書中這個方法返回的類型是int  當 SO_KEEPALIVE 選項為 true 時, 表示底層的TCP 實現會監(jiān)視該連接是否有效. 當連接處于空閑狀態(tài)(連接的兩端沒有互相傳送數據) 超過了 2 小時時, 本地的TCP 實現會發(fā)送一個數據包給遠程的 Socket. 如果遠程Socket 沒有發(fā)回響應, TCP實現就會持續(xù)嘗試 11 分鐘, 直到接收到響應為止. 如果在 12 分鐘內未收到響應, TCP 實現就會自動關閉本地Socket, 斷開連接. 在不同的網絡平臺上, TCP實現嘗試與遠程Socket 對話的時限有所差別.

SO_KEEPALIVE 選項的默認值為 false, 表示TCP 不會監(jiān)視連接是否有效, 不活動的客戶端可能會永遠存在下去, 而不會注意到服務器已經崩潰.

以下代碼把 SO_KEEPALIVE 選項設為 true:

if(!socket.getKeepAlive()) socket.setKeepAlive(true);

5.8 OOBINLINE 選項

設置該選項: public void setOOBInline(boolean on) throws SocketException  讀取該選項: public boolean getOOBInline() throws SocketException //原書中這個方法返回的類型是int  當 OOBINLINE 為 true 時, 表示支持發(fā)送一個字節(jié)的 TCP 緊急數據. Socket 類的 sendUrgentData(int data) 方法用于發(fā)送一個字節(jié)的 TCP緊急數據.

OOBINLINE 的默認值為 false, 在這種情況下, 當接收方收到緊急數據時不作任何處理, 直接將其丟棄. 如果用戶希望發(fā)送緊急數據, 應該把 OOBINLINE 設為 true:

socket.setOOBInline(true);

此時接收方會把接收到的緊急數據

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四
欧美成人精品影院| 每日更新成人在线视频| 国产精品日日摸夜夜摸av| 国产精品高潮视频| 欧美伦理在线观看| 国产精品theporn| 国产精品视频内| 一色屋精品视频在线观看网站| 亚洲国产成人精品视频| 亚洲少妇诱惑| 久久米奇亚洲| 一区二区三区日韩精品视频| 久久成人免费视频| 欧美日韩国产精品 | 巨乳诱惑日韩免费av| 欧美日韩精品免费观看视频| 国产日韩在线看片| 亚洲精品视频一区二区三区| 欧美亚洲一区三区| 欧美日韩一二三区| 亚洲高清不卡av| 欧美在线观看日本一区| 欧美日韩一区二区高清| 在线播放日韩欧美| 久久精品国产视频| 国产精品一区在线播放| 一区二区三区高清在线| 欧美成人精品高清在线播放| 国产一级一区二区| 亚洲欧美国产视频| 欧美日韩国产综合久久| 日韩视频中文字幕| 久久影院亚洲| 国产资源精品在线观看| 午夜亚洲激情| 欧美三级视频在线观看| 亚洲精品中文字| 六十路精品视频| 影音先锋日韩有码| 欧美亚洲专区| 欧美深夜福利| 日韩视频在线一区二区三区| 欧美黄色日本| 午夜精品久久久久久久久久久| 免费成人黄色片| 国产精品一页| 久久精品国产99| 国产精品一区二区你懂得 | 久久国产高清| 国产在线精品自拍| 欧美在线网址| 黄色成人免费观看| 免费亚洲婷婷| 亚洲精选91| 欧美午夜不卡影院在线观看完整版免费| 亚洲精品韩国| 欧美区高清在线| 亚洲小说春色综合另类电影| 欧美视频中文一区二区三区在线观看 | 欧美激情一区二区三区在线| 欧美精品三级| 一区二区三区欧美在线观看| 欧美日韩一区不卡| 先锋影院在线亚洲| 尹人成人综合网| 亚洲欧美日本另类| 激情综合色综合久久| 麻豆91精品91久久久的内涵| 精品99一区二区三区| 久久蜜桃精品| 亚洲日本成人网| 免费观看成人www动漫视频| 日韩午夜精品| 国产一区二区三区自拍| 欧美极品在线视频| 一区二区三区国产精品| 国产色产综合产在线视频| 免费视频一区| 欧美一区日本一区韩国一区| 在线观看一区二区精品视频| 国产精品vvv| 久久精品视频播放| 一本色道久久综合亚洲二区三区| 国产精品婷婷| 日韩视频一区| 国产精品每日更新| 欧美sm视频| 99精品热6080yy久久 | 欧美午夜片在线免费观看| 一区二区三区www| 黄色另类av| 欧美性事在线| 久久婷婷色综合| 亚洲一区二区三区三| 日韩视频中午一区| 亚洲国产欧美精品| 伊人久久大香线| 国产乱人伦精品一区二区| 欧美片第一页| 久久婷婷国产麻豆91天堂| 欧美一区不卡| 欧美伊人影院| 欧美一区二区高清| 一区二区精品国产| 91久久精品国产91性色| 一区在线免费观看| 国内精品久久久久久| 国产精品视频内| 欧美视频不卡中文| 欧美精品久久99| 久久精品视频免费播放| 国产一区二区0| 久久久97精品| 国产精品99久久99久久久二8| 激情国产一区二区| 国产日韩欧美精品一区| 欧美成人午夜视频| 亚洲永久字幕| 欧美精品三级在线观看| 最近中文字幕日韩精品 | 久久精品国产久精国产思思| 国产日韩欧美精品综合| 日韩午夜免费视频| 欧美日精品一区视频| 久久成人国产| 国产在线一区二区三区四区| 欧美精选一区| 蜜乳av另类精品一区二区| 午夜精品福利在线观看| 亚洲伦理一区| 尤物在线精品| 国产精品揄拍500视频| 欧美日韩一区二区在线| 蜜桃视频一区| 久久久亚洲国产天美传媒修理工| 亚洲一级网站| 亚洲伦理精品| 亚洲精品五月天| 亚洲精品久久7777| 伊人精品在线| 欧美日韩精品三区| 欧美日韩成人| 欧美不卡激情三级在线观看| 久久亚洲欧美国产精品乐播| 久久久久久久综合色一本| 亚洲综合精品自拍| 亚洲无线视频| 亚洲免费人成在线视频观看| 在线视频你懂得一区| 亚洲乱亚洲高清| 亚洲老司机av| 亚洲精品美女在线| 一区二区三区四区国产| 国产精品中文字幕在线观看| 亚洲在线一区| 欧美伦理91i| 国产精品福利在线观看| 欧美日韩精品二区第二页| 欧美日本成人| 国产精品久久久久久久9999 | 亚洲永久精品国产| 亚洲桃色在线一区| 午夜精品99久久免费| 欧美一级午夜免费电影| 久久久亚洲一区| 欧美日韩国产精品一区| 国产精品电影网站| 国产亚洲一级高清| 国产欧美在线观看| 久久综合给合| 麻豆精品传媒视频| 欧美成人免费播放| 国产精品成人aaaaa网站 | 国产精品激情偷乱一区二区∴| 欧美日韩国产在线一区| 国产精品社区| 亚洲人体一区| 欧美亚洲网站| 欧美成人午夜| 国产精品第一区| 在线精品亚洲一区二区| 国产精品亚洲一区| 国产一区二区三区免费不卡| 亚洲人成网在线播放| 亚洲午夜一区二区| 麻豆精品在线视频| 国产九色精品成人porny| 亚洲国产精品久久久| 亚洲一区二区三区四区中文| 久久精品日韩欧美| 欧美日韩亚洲一区三区| 国产综合第一页| 亚洲国产高清一区二区三区| 亚洲一区欧美二区| 国产欧美婷婷中文| 亚洲日韩中文字幕在线播放| 久久激情视频久久| 欧美日韩高清免费| 欧美极品一区二区三区| 亚洲国产欧美一区二区三区同亚洲|