如何用socket.sendUrgentData()发送紧急数据(一般用不到,了解)

TCP的紧急指针,一般都不建议使用,而且不同的TCP/IP实现,也不同,一般说如果你有紧急数据宁愿再建立一个新的TCP/IP连接发送数据,让对方紧急处理。但是,虽然sendUrgentData的参数data是int类型,但只有这个int类型的低字节被发送,其它的三个字节被忽略。下面的代码演示了如何使用SO_OOBINLINE选项来发送单字节数据。
[java]  view plain  copy
  1. package socket;  
  2.   
  3. import java.io.*;  
  4. import java.net.*;  
  5.   
  6. import org.apache.log4j.Logger;  
  7.   
  8. public class Test_OOBInline {  
  9.     private static Logger logger = Logger.getLogger(Test_OOBInline.class);  
  10.   
  11.     public static void main(String[] args) throws UnknownHostException, IOException {  
  12.         Socket socket = new Socket("127.0.0.1"1234);  
  13.         socket.setOOBInline(true);  
  14.         OutputStream out = socket.getOutputStream();  
  15.         OutputStreamWriter outWriter = new OutputStreamWriter(out);  
  16.         outWriter.write(67); // 向服务器发送字符"C"  
  17.         outWriter.write("hello world\r\n");  
  18.         socket.sendUrgentData(65); // 向服务器发送字符"A"  
  19.         socket.sendUrgentData(322); // 向服务器发送字符"B"  
  20.         outWriter.flush();  
  21.         socket.sendUrgentData(214); // 向服务器发送汉字”中”  
  22.         socket.sendUrgentData(208);  
  23.         socket.sendUrgentData(185); // 向服务器发送汉字”国”  
  24.         socket.sendUrgentData(250);  
  25.         socket.close();  
  26.     }  
  27. }  
  28.   
  29. class Server {  
  30.     public static void main(String[] args) throws Exception {  
  31.         ServerSocket serverSocket = new ServerSocket(1234);  
  32.         System.out.println("服务器已经启动,端口号:1234");  
  33.         while (true) {  
  34.             Socket socket = serverSocket.accept();  
  35.             socket.setOOBInline(true);  
  36.             InputStream in = socket.getInputStream();  
  37.             InputStreamReader inReader = new InputStreamReader(in);  
  38.             BufferedReader bReader = new BufferedReader(inReader);  
  39.             System.out.println(bReader.readLine());  
  40.             System.out.println(bReader.readLine());  
  41.             socket.close();  
  42.         }  
  43.     }  
  44. }  

结果:
服务器已经启动,端口号: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来发送数据

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值