java socket参数详解:OOBInline和UrgentData .
生活随笔
收集整理的這篇文章主要介紹了
java socket参数详解:OOBInline和UrgentData .
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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();}} }
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();}} }
結果:
服務器已經啟動,端口號:1234
ABChello 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來發送數據
總結
以上是生活随笔為你收集整理的java socket参数详解:OOBInline和UrgentData .的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我应该做的更差吗?
- 下一篇: 2011-07-04 22:11 Jfr