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(…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...

如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
初级程序员入门指南
初级程序员入门指南 在数字化浪潮中,编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言,明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 (一)编程语言抉择 编…...
数据库优化实战指南:提升性能的黄金法则
在现代软件系统中,数据库性能直接影响应用的响应速度和用户体验。面对数据量激增、访问压力增大,数据库性能瓶颈经常成为项目痛点。如何科学有效地优化数据库,提升查询效率和系统稳定性,是每位开发与运维人员必备的技能。 本文结…...