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來發送資料。