Socket(三)
文章目录
- 1. 设置Socket选项
- 2. TCP_NODELAY
- 3. SO_LINGER
- 4. SO_TIMEOUT
- 5. SO_RCVBUF和SO_SNDBUF
- 6. SO_KEEPALIVE
- 7. OOBINLINE
- 8. SO_REUSEADDR
- 9. IP_TOS服务类型
- 10. Socket异常
1. 设置Socket选项
Socket选项指定了Java Socket类所依赖的原生socket如何发送和接受数据,对于客户端,java有9种选项
- TCP_NODELAY
- SO_BINDADDR
- SO_TINEOUT
- SO_LINGER
- SO_SNDBUF
- SO_RCVBUF
- SO_KEEPALIVE
- OOBINLINE
- IN_TOS
2. TCP_NODELAY
public void setTcpNoDelay(boolean on)throws SocketException
public boolean getTcpNoDelay() throws SocketException
设置该选项可一确保包会尽可能地发送,无论包的大小。正常情况下,小数据包(一字节)在发送前会组合成更大的包。在发送另一个包之前,本地主机要等待远程系统对前一个包的确认。这称为Nagle算法。该算法的问题是,如果远程系统没有足够快的确认发送回本地系统,那么依赖于小数据量信息稳定传输的应用程序会变得很慢。设置TCP_NODELAY
为true可以打破这种缓冲模式,这样所有的包一旦就绪就会全部发送。setTcpNoDelay(true)
关闭了Socket的缓冲,这两个方法都声明为抛出一个SocketException异常。如果底层Socket实现不支持TCP_NODELAY选项,就会抛出这个异常。
3. SO_LINGER
public void setSoLinger(boolean on ,int seconds)throws SocKetException
public int getSoLinger()throws SocketException
该选项指定了Socket关闭时如何处理未发送的数据报。默认情况下,close()方法将立即返回,但系统仍然会继续尝试发送剩下未有发送的数据。如果seconds(延迟时间)设置为0,那么当socket关闭时,所有没有发送的数据都将被丢弃。如果设置为任意数,close()方法会被阻塞(阻塞时间为指定的延迟时间),等待发送数据和确认。如果底层Socket不支持该选项,会抛吹SocKetException
。如果getSoLinger
返回-1说明该选项被关闭了,会使用系统的默认选项。
4. SO_TIMEOUT
public void setSoTimeout(int milliseconds)throws SocketException
public void getSoTimeout() throws SocketException
正常情况下,尝试从Socket读取数据时,read()调用会阻塞尽可能长的时间来得到足够的字节,设置这个选项可以确保这次调用阻塞时间不会超过我们设置的时间,如果超过了会抛出InterruptedException
异常,不过Socket并不会断开,下次还是可以调用read再次读取。超时时间单位为毫秒,0被解释为无限超时(这也是默认值)。当底层Socket不支持该选项时,同样会抛出SocketException
异常
5. SO_RCVBUF和SO_SNDBUF
TCP使用缓冲区提升网络性能,较大的缓冲区会提升快速连接的性能,而较慢的拨号连接利用较小的缓冲区会有更好的表现。一般来说传输连续的大数据块时,可以从缓冲区受益;而对于交互式会话的小数据量传输,大缓冲区则会受益很小。最大带宽可以由缓冲区大小/延迟来得到,延迟是与网络硬件相关的,所以我们只能从缓存区的角度去提升网络带宽。SO_RCVBUF
选项控制用于网络输入的建议的接受缓冲区大小。SO_SNDBUF
选项则控制用于网络输出的建议大小。(建议大小,说明底层实现可以忽略该建议)
public void setReceiveBufferSize(int size) throws SocketException, IllegalArgumentException
public int getReceiveBufferSize()throws SocketException
public void setSendBufferSize()throws SocketException, IllegalArgumentException
public int getSendBufferSize()throws SocketException
看起来可以使用上面的方法独立的设置输入缓存区和输出缓冲区,但实际上缓存区会设置为输入和输出缓冲区中间较小的那一个。 一般来说,如果你发现你的应用不能充分利用可用带宽(例如,你有一个25Mb/s的Internet连接,但是数据传输速率仅为1.5Mb/s),那么可以试着增加缓冲区的大小。相反地,如果存在丢包现象和拥塞现象,则要减少缓冲区大小。
6. SO_KEEPALIVE
如果打开了该选项,客户端会偶尔通过一个空闲连接发送一个数据包,以确保服务器未崩溃(类似于服务器集群中的心跳机制)。如果服务器没有响应这个包,客户端会持续尝试11分钟多的时间,直到接受到响应为止。如果还没有接受到响应,客户端就会主动关闭Socket。如果没有设置该选项,不活动的客户端会永远存活下去,而不会注意到服务器已经奔溃。该选项的默认值为false
public void setKeepAlive(boolean on) throws SocketException
public boolean getKeepAlive()throws SocketException
7. OOBINLINE
TCP包括一个可以发送单字节带外(Out of Band,OOB)“紧急”数据的特性。这个数据会立即发送,此外当紧急方收到紧急数据时会得到通知,在其他已收到的数据之前处理这个数据。发送方法的名为sendUrgentData()
public void sendUrgentData(int data)throws IOException
这个方法几乎会立即发送参数中最低字节位。如果必要,当前缓存的所有数据将首先刷新输出,接受端会将紧急数据以适当的顺序放在正常接收的数据队列中,告诉应用程序紧急数据已经可用,让应用程序在队列中查找紧急数据。默认情况下,java会忽略从Socket接受的紧急数据,如果要接受的话,可以使用下面的方法:
public void setOOBInline(boolean on) throws SocketException
public boolean getOOBInline()throws SocketException
一旦打开OOBInline,到达的任何仅仅数据会以正常的方法放入Socket的输入流中等待读取,Java不区分紧急数据和非紧急数据,这使得它不能理想的发挥作用。
8. SO_REUSEADDR
一个Socket关闭时,可能不会立即释放本地端口,尤其是当Socket关闭时若仍有一个打开的连接,就不会释放本地端口。有时可能需要等一段时间,确保接收所有要发送到这个端口的延迟数据包,Socket关闭时这些数据包仍然可能在网上传播。心痛过不会对接收到的延迟包作任何处理,只是希望这些数据不会意外掉落到绑定到统一端口的新进程。如果使用随机端口,这不是大问题,但是Socket绑定到一个已知端口,会阻止其他Socket使用这个端口。如果开启该选项(默认为关闭),就允许另一个Socket绑定到这个端口,即使此时仍有可能存在前一个Socket接收到的数据。由下面两个方法确定:
public void setReuseAddress(boolean on)throws SocketException
public boolean getReuserAddress()throws SocketException
要正常使用上面方法,setReuseAddress()
必须在为这个端口绑定新Socket之前调用。这意味着Socket必须使用无参数构造函数以非连接状态创建,然后调用setReuseAddress(true)
,再使用connect()方法连接Socket。之前连接的Socket和重用老地址的新Socket都必须设置SO_REUSEADDR
为true,这样才会生效。
9. IP_TOS服务类型
不同类型的Internet服务有不同的性能需求。例如,为了得到较好的性能,视频需要相对较高的带宽和较短的延迟,而电子邮件可以通过低带宽的连接传递,甚至延迟几个小时都不会造成很大的伤害。服务类型存储在IP首部中一个名为IP_TOS的8位字段中。Java运行你使用 下面两个方法检查和设置Socket放在这个字段中的值:
public int getTrafficClass()throws SocketException
public void setTrafficClass() throws SocketException
业务类型流以0-255之间给出。由于这个值要复制到TCP首部中的一个8位字段,所以只使用这个int的低字节,超出个范围的值会导致IllegalArgumentException
异常。在21世纪的TCP栈中,这个字节的高6位包含一个差分服务代码点(DSCP)值,低两位包含一个显示拥塞通知(ECN),因此DSCP允许有64种不同的业务流。不过要由各个网络和路由器指定这64个不同的DSCP值分别代表什么含义。
PHB(逐跳行为) | 二进制值 | 用途 |
---|---|---|
默认 | 00000 | Best-effort(尽力)业务流 |
加速转发 | 101110低 | 损耗、低延迟、低抖动业务流。通常仅限于网络容量的30%或更低 |
保证转发 | 多个 | 保证最多以一个指定速率传送 |
类选择器 | xxx000 | 与IPv4 TOS首部向后兼容(存储在前3位中) |
Socket s=new Socket("www.baidu.com",80);
s.setTrafficClass(0xB8);
DSCP值并不是服务的严格保证。实际上,尽管一些网络会在内部参考DSCP值,但包越过ISP时,这个信息几乎会被忽略。
10. Socket异常
Socket类大大多数方法都声明抛出IOException或其子类java.net.SocketException:
public class SocketException extends IOException
不过仅仅知道发生了问题,者对于处理问题往往是不够的。是不是因为远程主机忙而拒绝连接?还是因为没有服务在这个端口上监听而导致远程主机拒绝连接?或者是否因为网络拥塞或主机崩溃导致连接超时?SocketException有几个子类,可以对出现什么问题以及为什么会出问题提供有关的更多信息。
public class BindException extends SocketException
public class ConnectException extends SocketException
public class NoRouteToHostException extends SocketException
如果试图在一个正在使用的端口上构造Socket或ServerSocket对象,或者你没有足够的权限使用这个端口,就会抛出BindException异常。当连接被远程主机拒绝时,而拒绝的原因是由于主机忙或没有进程在监听该端口,此时就会抛出ConnectException异常。最后一点,NoRouteToHostException异常表示连接已经超时。java.net包还包括了ProtocolException异常,它是IOException的直接子类:
public class ProtocolException extends IOException
当从网络接收的数据违反TCP/IP规范时,会抛出这个异常。
相关文章:

Socket(三)
文章目录 1. 设置Socket选项2. TCP_NODELAY3. SO_LINGER4. SO_TIMEOUT5. SO_RCVBUF和SO_SNDBUF6. SO_KEEPALIVE7. OOBINLINE8. SO_REUSEADDR9. IP_TOS服务类型10. Socket异常 1. 设置Socket选项 Socket选项指定了Java Socket类所依赖的原生socket如何发送和接受数据࿰…...

【JVM】12. 垃圾回收相关概念
文章目录 12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出(OOM)内存泄漏(Memory Leak) 12.3. Stop The World12.4. 垃圾回收的并行与并发并发(Concurrent)并行(Parallel)并…...

Java 版 spring cloud 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...

【Linux系统基础快速入门详解】Linux系统命令行介绍、命令提示符知识详解: ~/#/@等符号
Linux系统的命令行界面是Linux系统的核心部分,也是最常用的部分。在命令行界面中,用户可以使用各种Linux系统命令进行文件操作、系统管理、网络管理等操作。下面介绍一些常见的Linux系统命令行知识,以及命令提示符中的一些符号的含义。 1. 命令行界面 在Linux系统中,命令…...

Python 面向对象编程笔记:中级面向对象
__super__() 在 Python 中,super 是一个内置函数,用于调用父类方法。该函数可以在子类中调用父类中被重写的方法,从而实现对父类方法的继承并且进行扩展。它能够动态地查找当前子类继承链中的下一个类,从而允许设计者更加灵活地…...

JVM学习笔记(上)
1、总体路线 2、程序计数器 Program Counter Register 程序计数器(寄存器) 作用:是记录下一条 jvm 指令的执行地址行号。 特点: 是线程私有的不会存在内存溢出 解释器会解释指令为机器码交给 cpu 执行,程序计数器会…...

反爬虫技术
预计更新 一、 爬虫技术概述 1.1 什么是爬虫技术 1.2 爬虫技术的应用领域 1.3 爬虫技术的工作原理 二、 网络协议和HTTP协议 2.1 网络协议概述 2.2 HTTP协议介绍 2.3 HTTP请求和响应 三、 Python基础 3.1 Python语言概述 3.2 Python的基本数据类型 3.3 Python的流程控制语句 …...

JAVA中.equals()与 ==的区别
1. “”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。 2..equals() equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比…...

华为OD机试之羊、狼、农夫过河(Java源码)
羊、狼、农夫过河 题目描述 羊、狼、农夫都在岸边,当羊的数量小于狼的数量时,狼会攻击羊,农夫则会损失羊。农夫有一艘容量固定的船,能够承载固定数量的动物。 要求求出不损失羊情况下将全部羊和狼运到对岸需要的最小次数。只计算…...

C++ string的简单应用
C语言的字符串 C的字符串 头文件: #include<string.h> //c #include<string> //C #include<cstring> //C 比较string的大小 两个string对象相加 使用字符串对象来存放字符串 两个string对象相加 string str "Hello,"; st…...

Java中的阻塞队列
阻塞队列的基本概念 1、生产者、消费者的概念 他俩是设计模式的一种,提出这两种概念,通过一个容器的方式能解决强耦合问题 生产者、消费者之间不会直接通讯。通过一个第三方容器、队列的方式进行通讯 生产者生产完数据放入容器之后,不用等待消…...

PriorityBlockingQueue无界阻塞优先级队列
PriorityBlockingQueue无界阻塞优先级队列 PriorityBlockingQueue 是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素,是二叉树最小堆的实 现,研究过数组方式存放最小堆节点的都知道,直接遍历队列元素是无序的。 如图 P…...

「HTML和CSS入门指南」p 标签详解
<p> 标签是什么? HTML5 中的 <p> 标签是用于定义段落的标签。它可以用来标记文章、新闻等长篇内容中的段落,并且可以与其他 HTML 元素配合使用。 <p> 标签的语法和属性 <p> 标签的语法非常简单,只需要在 HTML 文件中插入 <p> 和 </p>…...

【单目标优化算法】孔雀优化算法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

chatgpt赋能python:Python同一行多个语句:如何提高你的编程效率?
Python同一行多个语句:如何提高你的编程效率? Python是一种优雅的编程语言,拥有简洁易懂的语法,可以帮助你快速编写可以在各种领域使用的高级代码。其中,Python同一行多个语句,是一种可以大大提高编程效率…...

Java反射概述
2 反射 2.1 反射概述 Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象,调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展2.2 反射获取Class类的对象 我们要想通过反…...

《网络是怎样连接的》(一)
第一章web浏览器 简介 首先输入网址URL,浏览器进行解析,将我们需要哪些数据告诉服务器。浏览器向服务器发送消息,必须告诉操作系统的接收方的IP地址,所以浏览器先查出web服务器的IP地址,向DNS服务器查询域名对应的IP…...

Flink on yarn任务日志怎么看
1、jobmanager日志 在yarn上可以直接看 2、taskmanager日志 在flink的webui中可以看,但是flink任务失败后,webui就不存在了,那怎么看? 这是jobmanager的地址 hadoop02:19888/jobhistory/logs/hadoop02:45454/container_e03_16844…...

二次元的登录界面
今天还是继续坚持写博客,然后今天给大家带来比较具有二次元风格的登录界面,也只是用html和css来写的,大家可以来看看! 个人名片: 😊作者简介:一名大一在校生,web前端开发专业 &…...

2. 量化多因子数据清洗——去极值、标准化、正交化、中性化
一、去极值 1. MAD MAD(mean absolute deviation)又称为绝对值差中位数法,是一种先需计算所有因子与平均值之间的距离总和来检测离群值的方法. def extreme_MAD(rawdata, n): median rawdata.quantile(0.5) # 找出中位数 new_median (abs(…...

皮卡丘反射型XSS
1.反射型xss(get) 进入反射型xss(get)的关卡,我们可以看到如下页面 先输入合法数据查看情况,例如输入“kobe” 再随便输入一个,比如我舍友的外号“xunlei”,“666”,嘿嘿嘿 F12查看源代码,发现你输入的数…...

巧计口诀-软件测试的生命周期,黑盒测试设计方法
目录 1。口诀 2。黑盒设计方法适用场合 3。黑盒设计方法详解 3.1。等价类法 3.2。 边界值法 3.3。判定表法 3.4。因果表 3.5。状态迁移图 3.6。场景法 3.7。正交实验法 3.8。错误推断法 1。口诀 又到了找工作的日子,背诵这些基本知识和概念又开始了。我找…...

Android系统的Ashmem匿名共享内存系统分析(1)- Ashmem驱动
声明 其实对于Android系统的Ashmem匿名共享内存系统早就有分析的想法,记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾…文中参考了很多书籍及博客内容,可能涉及的比较…...

Redis 事务详细介绍
事务 注意:Redis单条命令是保证原子性的;但是事务不保证原子性! Redis事务没有隔离级别的概念,所有的命令在事务中,并没有直接被执行,只有发起执行命令时才执行 Redis事务本质:一组命令的集合&…...

2023-5-29第二十九天
consult咨询,查阅,商讨 specialize专门从事,专攻 inspect检查 pattern图案,方式 optimize使最优化 ensemble整体,全体 subscript下标 subscribe签名 sector行业,部门 precedence优先,优…...

【第三方库】PHP实现创建PDF文件和编辑PDF文件
目录 引入Setasign/fpdf、Setasign/fpdi 解决写入中文时乱码问题 1.下载并放置中文语言包(他人封装):https://github.com/DCgithub21/cd_FPDF 2.编写并运行生成字体文件的程序文件(addFont.php) 中文字体举例&…...

线程的回收及内存演示
ps -elf|grep mthread 查看进程和线程 top -p 6513 查看内存 一、线程的回收 使用pthread_join 函数: #include <pthread.h> int pthread_join(pthread_t thread, void **retval); 注意:pthread_join 是阻塞函数,如果回收的线…...

高精度倾角传感器测量原理
高精度倾角传感器测量原理技术参数 1.性能参数 测量范围:0~30 测量精度:0.06 分 辨 率:0.0001 测量方向:X,Y 时间漂移:0.08/月 更新时间:30ms 上电启动时间:0.5s 2.电…...

Android 12 init流程分析
前言 刚开始接触需要了解的概念理解过程遇到了什么问题代码的位置和流程分析如何分析和调试遇到的问题 基本的概念 .rc 文件 这个文件在Android framework 中服务相关代码可以看到。类似surfaceflinger.rc 、mediaserver.rc等等。 在这些rc里面定义了某一个service࿰…...

【Python小技巧】Python操控Chrome浏览器实现网页打开、切换、关闭(送独家Chrome操作打包类源码、Chrome浏览器Cookie在哪里?)
文章目录 前言一、什么时候需要用Python控制浏览器?二、下载Chrome浏览器驱动文件1. 安装Chrome浏览器并查看版本2. 下载浏览器驱动文件3. 解压到python编译器目录(python.exe所在目录) 三、Python控制Chrome浏览器(附源代码&…...