java socket参数详解:OOBInline和UrgentData
2012-03-10 20:50
309 查看
TCP的紧急指针,一般都不建议使用,而且不同的TCP/IP实现,也不同,一般说如果你有紧急数据宁愿再建立一个新的TCP/IP连接发送数据,让对方紧急处理。但是,虽然sendUrgentData的参数data是int类型,但只有这个int类型的低字节被发送,其它的三个字节被忽略。下面的代码演示了如何使用SO_OOBINLINE选项来发送单字节数据。
从图上可以看出,虽然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来发送数据。
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
- java socket参数详解:OOBInline和UrgentData
- java socket参数详解:OOBInline和UrgentData .
- java socket参数详解:OOBInline和UrgentData (可用于简体网络是否畅通)
- java socket参数详解:SO_REUSEADDR
- java socket参数详解:BackLog
- java socket参数详解:BackLog
- Java学习总结12——网络1(Java Socket参数详解)
- java socket参数详解:SoLinger
- Java Socket参数详解
- java socket参数详解:TcpNoDelay
- java socket参数详解:SendBufferSize和ReceiveBufferSize
- java socket参数详解:BackLog
- java socket参数详解:SoTimeout
- ChannelOption.SO_BACKLOG, 1024-> java socket参数详解:BackLog
- java socket参数详解:SoLinger
- java socket参数详解:KeepAlive
- java socket参数详解:KeepAlive
- java socket参数详解:SoTimeout
- java socket参数详解:SendBufferSize和ReceiveBufferSize