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();
}
}
}
结果:
服务器已经启动,端口号: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 参数详解
Java socket参数选项: TCP_NODELAY: 表示立即发送数据 SO_RESUSEADDR: 表示是否允许重用socket所绑定的本地地址 SO_TIMEOUT : 表示接收数据时 ...
- java ext.dirs_关于-Djava.ext.dirs使用及JAVA 命令参数详解System.setProperty
大家在linux环境下使用命令行执行java程序时,经常要使用到大量外部的jar包或class文件,一般我们有哪些方式可以用呢? -classpath,命令格式:# java -classpath , ...
- Java Socket编程详解
Java Socket编程是Java网络编程很重要的内容,现参考了许多资料,总结如下: 1. Java网络编程原理+Socket编程 http://www.cnblogs.com/linzheng/a ...
- java backlog满_java socket参数详解:BackLog
输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数.如果队列满时收到连接指示,则拒绝该连接. 注意: 1. backlog参数必须是大于 0 的正值.如果传递的值等于或小于 0, ...
- 【Netty】option(ChannelOption.SO_KEEPALIVE, true) socket参数详解:KeepAlive
.childOption(ChannelOption.SO_KEEPALIVE, true); childOption是用来给父级ServerChannel之下的Channels设置参数的 当设置为t ...
- java虚拟机参数详解
Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOME\bin\java –option 来启动,-option为虚拟机参数,JAVA_H ...
- java 可变参数 详解(通俗易懂)
目录 一.概述: 二.格式: 三.注意事项(使用规范): 四.代码演示: 演示规范①~③: 演示规范④: 演示规范⑤: 课堂练习: 代码演示: 输出结果: 五.英文版本讲解: 一.概述: java中, ...
- Java运行参数详解
JRE版本 admindeMacBook-Pro:~ admin$ java -version java version "1.8.0_111" Java(TM) SE Runti ...
- java命令行参数详解
java 命令参数详解_赶路人儿的博客-CSDN博客_java命令行参数java命令用于启动 java 应用:它首先会启动 java 运行时环境(JRE),然后加载指定的类,调用类的main()方法. ...
最新文章
- LOJ2586 APIO2018 选圆圈
- OpenStack icehouse系列之计算节点搭建
- Build Roads
- Java并发编程面试题(2020最新版)
- std::chrono::duration_cast时间计算
- kali里PHP文件502错误,解决Linux Kali iptables开放22端口失败等一系列问题
- json日期格式问题的办法
- 信息图:iOS 7开发者需要知道的事
- /etc/apt/sources.list.d/ros-latest.list' permission denied
- Visual Studio 2015 移动跨平台开发初体验
- Confluence 会议记录(Meeting Notes)蓝图
- linux连接苹果鼠标,Linux 5.13添加对苹果Magic Mouse 2和微软SAM的支持
- typedef的4种常见用法
- 操作系统-进程管理(信号量机制)
- python程序自动运行_定时后台运行Python程序
- openGL增强表面细节--凹凸贴图具体实现
- P2132 小Z的队伍排列-杨氏矩阵与hook定理
- matlab解方程、方程组
- python 有损和无损 方式替换表情符号
- ES6数组去重的方法