java socket參數詳解:OOBInline和UrgentData

來源:互聯網
上載者:User

TCP的緊急指標,一般都不建議使用,而且不同的TCP/IP實現,也不同,一般說如果你有緊急資料寧願再建立一個新的TCP/IP串連發送資料,讓對方緊急處理。但是,雖然sendUrgentData的參數data是int類型,但只有這個int類型的低位元組被發送,其它的三個位元組被忽略。下面的代碼示範了如何使用SO_OOBINLINE選項來發送單位元組資料。

package socket;import java.io.*;import java.net.*;import org.apache.log4j.Logger;public class Test_OOBInline {private static Logger logger = Logger.getLogger(Test_OOBInline.class);public static void main(String[] args) throws UnknownHostException, IOException {Socket socket = new Socket("127.0.0.1", 1234);socket.setOOBInline(true);OutputStream out = socket.getOutputStream();OutputStreamWriter outWriter = new OutputStreamWriter(out);outWriter.write(67); // 向伺服器發送字元"C"outWriter.write("hello world\r\n");socket.sendUrgentData(65); // 向伺服器發送字元"A"socket.sendUrgentData(322); // 向伺服器發送字元"B"outWriter.flush();socket.sendUrgentData(214); // 向伺服器發送漢字”中”socket.sendUrgentData(208);socket.sendUrgentData(185); // 向伺服器發送漢字”國”socket.sendUrgentData(250);socket.close();}}class Server {public static void main(String[] args) throws Exception {ServerSocket serverSocket = new ServerSocket(1234);System.out.println("伺服器已經啟動,連接埠號碼:1234");while (true) {Socket socket = serverSocket.accept();socket.setOOBInline(true);InputStream in = socket.getInputStream();InputStreamReader inReader = new InputStreamReader(in);BufferedReader bReader = new BufferedReader(inReader);System.out.println(bReader.readLine());System.out.println(bReader.readLine());socket.close();}}}

結果:

伺服器已經啟動,連接埠號碼:1234ABChello world中國


從圖上可以看出,雖然322分布在了兩個位元組上,但它的低位元組仍然是66。
在Client類中使用flush將緩衝區中的資料發送到伺服器。我們可以從輸出結果發現一個問題,在Client類中先後向伺服器發送了'C'、"hello world"r"n"、'A'、'B'。而在服務端程式的控制台上顯示的卻是ABChello world。這種現象說明使用sendUrgentData方法發送資料後,系統會立即將這些資料發送出去;而使用write發送資料,必須要使用flush方法才會真正發送資料。
在Client類中向伺服器發送"中國"字串。由於"中"是由214和208兩個位元組組成的;而"國"是由185和250兩個位元組組成的;因此,可分別發送這四個位元組來傳送"中國"字串。
注意:在使用setOOBInline方法開啟SO_OOBINLINE選項時要注意是必須在用戶端和服務端程式同時使用setOOBInline方法開啟這個選項,否則無法命名用sendUrgentData來發送資料。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.