java setsolinger_java socket 的参数选项解读(转)

在MulticastSocket的源代码里有设置多播的方法:

48304ba5e6f9fe08f3fa1abda7d326ab.png

public void setInterface(InetAddress inf) throwsSocketException {

if(isClosed()) {

throw new SocketException("Socket is closed");

}

checkAddress(inf, "setInterface");

synchronized(infLock) {

getImpl().setOption(SocketOptions.IP_MULTICAST_IF, inf);

infAddress =inf;

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

7、public final static int IP_MULTICAST_IF2 = 0x1f;

这个字段的效果和上面的是一样的,只是扩展支持IPV6

8、public final static int IP_MULTICAST_LOOP = 0x12;

用来设置本地回环接口的多播特性,在MulticastSocket源代码中有相关方法:

48304ba5e6f9fe08f3fa1abda7d326ab.png

/*** Disable/Enable local loopback of multicast datagrams

* The option is used by the platform's networking code as a hint

* for setting whether multicast data will be looped back to

* the local socket.

*

*

Because this option is a hint, applications that want to

* verify what loopback mode is set to should call

* {@link#getLoopbackMode()}

* @paramdisable true to disable the LoopbackMode

* @throwsSocketException if an error occurs while setting the value

* @since1.4

* @see#getLoopbackMode

*/

public void setLoopbackMode(boolean disable) throwsSocketException {

getImpl().setOption(SocketOptions.IP_MULTICAST_LOOP, Boolean.valueOf(disable));

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

9、public final static int IP_TOS = 0x3;

这个参数是用来控制IP头中的TOS字段的,是用来控制和优化IP包的路径的,在Socket源代码里有一个设置的方法:

48304ba5e6f9fe08f3fa1abda7d326ab.png

/*** Sets traffic class or type-of-service octet in the IP

* header for packets sent from this Socket.

* As the underlying network implementation may ignore this

* value applications should consider it a hint.

*

*

The tc must be in the range 0 <= tc <=

* 255 or an IllegalArgumentException will be thrown.

*

Notes:

*

For Internet Protocol v4 the value consists of an octet

* with precedence and TOS fields as detailed in RFC 1349. The

* TOS field is bitset created by bitwise-or'ing values such

* the following :-

*

*

*

IPTOS_LOWCOST (0x02)

*

IPTOS_RELIABILITY (0x04)

*

IPTOS_THROUGHPUT (0x08)

*

IPTOS_LOWDELAY (0x10)

*

* The last low order bit is always ignored as this

* corresponds to the MBZ (must be zero) bit.

*

* Setting bits in the precedence field may result in a

* SocketException indicating that the operation is not

* permitted.

*

* As RFC 1122 section 4.2.4.2 indicates, a compliant TCP

* implementation should, but is not required to, let application

* change the TOS field during the lifetime of a connection.

* So whether the type-of-service field can be changed after the

* TCP connection has been established depends on the implementation

* in the underlying platform. Applications should not assume that

* they can change the TOS field after the connection.

*

* For Internet Protocol v6 tc is the value that

* would be placed into the sin6_flowinfo field of the IP header.

*

* @paramtc an int value for the bitset.

* @throwsSocketException if there is an error setting the

* traffic class or type-of-service

* @since1.4

* @see#getTrafficClass

*/

public void setTrafficClass(int tc) throwsSocketException {

if (tc < 0 || tc > 255)

throw new IllegalArgumentException("tc is not in range 0 -- 255");

if(isClosed())

throw new SocketException("Socket is closed");

getImpl().setOption(SocketOptions.IP_TOS, newInteger(tc));

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

从源代码的注释看,TOS设置了是否生效,和底层的操作系统的实现有关。应用程序无法保证TOS的变更会对socket连接产生影响。个人认为,TOS在一般情况下用不到。

10、public final static int SO_LINGER = 0x0080;

先看Socket源代码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

/*** Enable/disable SO_LINGER with the specified linger time in seconds.

* The maximum timeout value is platform specific.

*

* The setting only affects socket close.

*

* @paramon whether or not to linger on.

* @paramlinger how long to linger for, if on is true.

* @exceptionSocketException if there is an error

* in the underlying protocol, such as a TCP error.

* @exceptionIllegalArgumentException if the linger value is negative.

* @sinceJDK1.1

* @see#getSoLinger()

*/

public void setSoLinger(boolean on, int linger) throwsSocketException {

if(isClosed())

throw new SocketException("Socket is closed");

if (!on) {

getImpl().setOption(SocketOptions.SO_LINGER, newBoolean(on));

} else{

if (linger < 0) {

throw new IllegalArgumentException("invalid value for SO_LINGER");

}

if (linger > 65535)

linger = 65535;

getImpl().setOption(SocketOptions.SO_LINGER, newInteger(linger));

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

这个字段对Socket的close方法产生影响,当这个字段设置为false时,close会立即执行并返回,如果这时仍然有未被送出的数据包,那么这些数据包将被丢弃。如果设置为True时,有一个延迟时间可以设置。这个延迟时间就是close真正执行所有等待的时间,最大为65535。

11、public final static int SO_TIMEOUT = 0x1006;

48304ba5e6f9fe08f3fa1abda7d326ab.png

/*** Enable/disable SO_TIMEOUT with the specified timeout, in

* milliseconds. With this option set to a non-zero timeout,

* a read() call on the InputStream associated with this Socket

* will block for only this amount of time. If the timeout expires,

* a java.net.SocketTimeoutException is raised, though the

* Socket is still valid. The option must be enabled

* prior to entering the blocking operation to have effect. The

* timeout must be > 0.

* A timeout of zero is interpreted as an infinite timeout.

* @paramtimeout the specified timeout, in milliseconds.

* @exceptionSocketException if there is an error

* in the underlying protocol, such as a TCP error.

* @sinceJDK 1.1

* @see#getSoTimeout()

*/

public synchronized void setSoTimeout(int timeout) throwsSocketException {

if(isClosed())

throw new SocketException("Socket is closed");

if (timeout < 0)

throw new IllegalArgumentException("timeout can't be negative");

getImpl().setOption(SocketOptions.SO_TIMEOUT, newInteger(timeout));

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

这个参数用来控制客户端读取socket数据的超时时间,如果timeout设置为0,那么就一直阻塞,否则阻塞直到超时后直接抛超时异常。

12、public final static int SO_SNDBUF = 0x1001;

在默认情况下,输出流的发送缓冲区是8096个字节(8K)。这个值是Java所建议的输出缓冲区的大小。如果这个默认值不能满足要求,可以用setSendBufferSize方法来重新设置缓冲区的大小。

13、public final static int SO_RCVBUF = 0x1002;

在默认情况下,输入流的接收缓冲区是8096个字节(8K)。这个值是Java所建议的输入缓冲区的大小。如果这个默认值不能满足要求,可以用setReceiveBufferSize方法来重新设置缓冲区的大小。

14、public final static int SO_KEEPALIVE = 0x0008;

如果将这个参数这是为True,客户端每隔一段时间(一般不少于2小时)就像服务器发送一个试探性的数据包,服务器一般会有三种回应:

1、服务器正常回一个ACK,这表明远程服务器一切OK,那么客户端不会关闭连接,而是再下一个2小时后再发个试探包。

2、服务器返回一个RST,这表明远程服务器挂了,这时候客户端会关闭连接。

3、如果服务器未响应这个数据包,在大约11分钟后,客户端Socket再发送一个数据包,如果在12分钟内,服务器还没响应,那么客户端Socket将关闭。

15、public final static int SO_OOBINLINE = 0x1003;

如果这个Socket选项打开,可以通过Socket类的sendUrgentData方法向服务器发送一个单字节的数据。这个单字节数据并不经过输出缓冲区,而是立即发出。虽然在客户端并不是使用OutputStream向服务器发送数据,但在服务端程序中这个单字节的数据是和其它的普通数据混在一起的。因此,在服务端程序中并不知道由客户端发过来的数据是由OutputStream还是由sendUrgentData发过来的。

http://www.cnblogs.com/biakia/p/4321800.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】Linux终端下 dstat 监控工具

转自https://linux.cn/article-3215-1.html dstat 是一个可以取代vmstat&#xff0c;iostat&#xff0c;netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能&#xff0c;增加了监控项&#xff0c;也变得更灵活了。dstat可以很方便监控系统…

java jdbc连接db2数据库_Java连接db2数据库(常用数据库连接五)

1.安装好db2数据库&#xff0c;并建立表如下&#xff1a;2.eclipse或myeclipse中建立工程并导入java连接db2所需要的jar包db2java.jar 下载地址&#xff1a;http://download.csdn.net/detail/whzhaochao/64149813.建立iConn接口&#xff0c;代码如下&#xff1a;package com.zh…

Oracle通过邀请Weaver和Chin推动JavaFX向前发展

我昨天发布了愚人节帖子&#xff0c;内容涉及加入NASA协助探索红色大行星。 那个帖子与事实相距不远... NASA开发的技术的所有细节都是100&#xff05;准确的。 哎呀&#xff0c;即使我辞职也是事实&#xff01; 唯一不正确的部分是我将加入的公司。 在NASA协助探索火星的工作也…

WinForm------TextEdit只能输入数字

代码: this.textEdit1.Properties.Mask.EditMask "\d"; this.textEdit1.Properties.Mask.MaskType MaskType.RegEx; 转载于:https://www.cnblogs.com/tianhengblogs/p/6093634.html

JavaFX:创建Sprite动画

到目前为止&#xff0c;尽管我的大多数文章都涉及JavaFX属性和绑定&#xff0c;但今天我想写一讲我也致力于JavaFX运行时的另一部分&#xff1a;动画API。 在本文中&#xff0c;我将解释如何在JavaFX中编写自定义动画&#xff0c;以及如何使用这种方法为Sprite动画创建类。 &am…

使用UIBinder的GWT自定义按钮

这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandler(){Overridepub…

delete postman 传参_PostMan 传参boolean 类型,接口接受的值一直是false

情形&#xff1a;最近写前台页面的一个按钮&#xff0c;功能是&#xff1a;点击后切换状态&#xff0c;显示是或否。字段名称是isTest,类型是boolean 。写完接口&#xff0c;拿postMan测试&#xff0c;传参如下&#xff1a;但是后台接口接受的数据 一直是false,处理&#xff1a…

前端学PHP之文件操作

前端学PHP之文件操作 前面的话 在程序运行时&#xff0c;程序本身和数据一般都存在内存中&#xff0c;当程序运行结束后&#xff0c;存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据&#xff0c;或程序运行产生的结果&#xff0c;就需要把数据存储在文件或数…

腾讯云CentOS6.5下安装mysql,并配置好远程访问等权限,途中遇到的问题

1.使用yum命令安装mysql [rootbogon ~]# yum -y install mysql-server 2.设置开机启动 [rootbogon ~]# chkconfig mysqld on 3.启动MySQL服务 [rootbogon ~]# service mysqld start 4.设置MySQL的root用户设置密码 [rootbogon ~]# mysql -u root mysql> select u…

java runtime 异常_Java中RuntimeException和Exception

在java的异常类体系中,Error和RuntimeException是非检查型异常&#xff0c;其他的都是检查型异常。所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类不可以在不声明的情况下抛出非RuntimeException简单的说&#xff0c;非RuntimeException必要自己写catch块处…

java电脑运行视频演示_javaweb视频第一天(二)

无论通过哪种方式得到的class类对象&#xff0c;是同一个。比较的是地址码这里教会你&#xff1a;如何去使用class对象现在就知道这个&#xff1a;如何使用反射&#xff0c;并且说反射是实现了什么样的功能。如何通过反射得到里面的相应字段&#xff0c;得到里面的相应函数等等…

本月风味– Neo4j和Heroku

Neo4j今年早些时候发起了一项挑战&#xff0c;即“ 种子播云 ”&#xff0c;以使人们使用Neo4j附加组件在Heroku上创建模板或演示应用程序。 经过许多内部辩论之后&#xff0c;我决定进入&#xff0c;但由于缺乏想法而陷入绝望。 当我什么都没做的时候&#xff0c;这个主意就出…

[回归分析][10]--相关误差的问题

[回归分析][10]--相关误差的问题这一篇文章还是来分析相关误差的问题。 1.游程数 定义&#xff1a;游程数--残差穿过x-轴的次数 用这个可以检查如残差有一块在x轴上面&#xff0c;一块在x轴下面的情形。 如上面这样的残差 下面构造两个统计量&#xff1a; 其中 n…

使用MVC模式制作游戏-教程和简介

游戏开发中一种有用的体系结构模式是MVC&#xff08;模型视图控制器&#xff09;模式。 它有助于分离输入逻辑&#xff0c;游戏逻辑和UI&#xff08;渲染&#xff09;。 在任何游戏开发项目的早期阶段&#xff0c;其实用性很快就会被注意到&#xff0c;因为它允许快速更改内容&…

并发模式:生产者和消费者

在我15年的职业生涯中&#xff0c;生产者和消费者的问题是我仅遇到过几次。 在大多数编程情况下&#xff0c;我们正在做的事情是以同步方式执行功能&#xff0c;其中JVM或Web容器自行处理多线程的复杂性。 但是&#xff0c;在编写某些需要的用例时。 上周&#xff0c;我遇到了一…

作业管理系统数据字典

转载于:https://www.cnblogs.com/heyangcan/p/5312394.html

使用Hive和iReport进行大数据分析

每个JJ Abrams的电视连续剧疑犯追踪从主要人物芬奇先生一个下列叙述情节开始&#xff1a;“ 你是被监视。 政府拥有一个秘密系统-每天每天每小时都会对您进行监视的机器。 我知道是因为...我建造了它。 “当然&#xff0c;我们的技术人员知道得更多。 庞大的电气和软件工程师团…

docker集群管理

docker集群管理 ps&#xff1a;docker machine docker swarm docker compose 在Docker Machine发布之前&#xff0c;你可能会遇到以下问题&#xff1a; 你需要登录主机&#xff0c;按照主机及操作系统特有的安装以及配置步骤安装Docker&#xff0c;使其能运行Docker…

从0学java_从零开始学JAVA(一.Java的基础语法)

基本语法编写 Java 程序时&#xff0c;应注意以下几点&#xff1a;大小写敏感&#xff1a;Java 是大小写敏感的&#xff0c;这就意味着标识符 Hello 与 hello 是不同的。类名&#xff1a;对于所有的类来说&#xff0c;类名的首字母应该大写。如果类名由若干单词组成&#xff0c…

mysql添加字符串日期时间_mysql学习笔记--- 字符串函数、日期时间函数

一、常见字符串函数&#xff1a;1、CHAR_LENGTH 获取长度(字符为单位)2、FORMAT 格式化3、INSERT 替换的方式插入4、INSTR 获取位置5、LEFT/RIGHT 取左、取右6、LENGTH 获取长度(字节为单位)7、LTRIM/RTRIM/TRIM 去空格(左/右/自定义)8、STRCMP 字符串比较9、CONCAT 字…