理解java底层通讯协议
引言:
本周自己重新对底层通讯方式进行了学习,在此做一个输出。
分别从客户端发送多个请求的需求角度与服务端接收多个连接发送请求的需求角度,剖析4种基于java自身技术实现的消息方式通讯所带来的影响,解决方式以及各自通讯方式的区别和优缺点。
通讯协议的特性:
4种组合通讯方式区别和优缺点剖析:
TCP/IP+BIO:
对于客户端同时发送多个请求到服务端的问题:
简单直接的解决方式:生成多个socket连接
上述解决方式带来的影响:
1.生成太多的socket客户端会消耗大量的本地资源,当客户端机器多,服务端机器少时,客户端生成太多的socket会导致服务器端需要支撑非常高的连接数。
2.生成socket连接的过程通常是比较慢的,频繁创建会导致系统性能不足的问题。
针对上述影响问题的常见解决方案:
1.通常采用连接池的方式来维护socket连接,好处:一方面限制了能创建socket的个数,另一方面连接池避免了重复创建socket。
连接池方式带来的问题:
1.连接池中的socket个数是有限的,同时要用socket连接的请求过多的情况下就会造成资源竞争与大量的等待。
2.另外就是会遇到合理限制等待超时时间的问题,如果不设置超时会导致服务端处理变慢,进而导致客户端请求都在无限等待,而客户端资源是有限的,因此很容易出现服务端瓶颈引起客户端挂掉的现象。
那么,超时时间设置多少?这取决于客户端的请求量,以及服务端的处理速度,要在性能和出错率之间保持平衡。
对于服务端能同时接受多个连接发送的请求的问题:
直接的解决方案:
在accept获取socket后,将此socket放入一个线程中处理,即一个连接一个线程模式,这样服务器就可以接受多个连接发送请求了。
上述解决方式带来的影响:
1.无论socket连接上是否有真实的请求,都要耗费一个线程,为避免创建过多线程导致服务器资源耗尽,需限制线程创建的数量,这就造成了采用BIO情况下服务端所支撑的连接数是有限的问题。
TCP/IP+NIO:
对于客户端同时发送多个请求到服务端的问题:
实现方式:
与TCP/IP+BIO方式没有什么不同,但NIO可以做到不阻塞,如果服务器返回响应带上请求标识,那么客户端则可采用连接复用的方式,这可以降低连接池带来的资源争抢问题。
对于连接不复用的情况则采用socket.setSoTimeout方式来控制同步请求超时,连接复用设置超时时间可基于blockingqueue,对象的wait/notify机制,futrue机制来实现。
对于服务端能同时接受多个连接发送的请求的问题:
解决方式:
采用一个线程来监视连接事件,另一个或多个线程来监听网络读写流的事件,只有当实际网络流读写事件发生后,再放入线程池中处理。
带来的影响:
比TCP/IP+BIO方式能接受更多的连接,而这些连接只有在真实请求发生时才会创建线程处理,节省资源。
但当连接数不多,且连接数请求发送非常频繁时,不会带来太大的优势,不过实际场景中通常是服务端要支持接受非常多的连接,但是这些连接同时发送的请求并不多。
UDP/IP+BIO:
实现方式:
采用receive和send方法进行读写操作。
由于UDP方式不建立通讯连接,故没有连接竞争的问题,只是读写流的动作是同步的。
对于服务端能同时接受多个发送的请求,通过采用每收到一个packet 就放入一个线程中进行处理来实现。
UDP/IP+NIO:
对于UDP/IP通讯方式,NIO带来的好处只有在有流要读写时才做相应的IO操作,不用像BIO方式直接阻塞当前线程。
参考:《分布式java应用》
理解java底层通讯协议的更多相关文章
- 使用delphi 开发多层应用(十六)使用XMLRPC 实现basic4android 远程调用RTC服务(讲述了RTC的特点,其底层通讯协议是自己封装SOCK 库,与kbmmw 的适合场合不完全一样)
RealThinClient (以下简称RTC) 也是一款delphi 多层开发的框架,由于其底层通讯协议是自己封装SOCK 库,抛弃了 大家诟病的indy,因此表现的非常稳定,效率也非常高, ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- java基础55 UDP通讯协议和TCP通讯协议
本文知识点(目录): 1.概述 2.UDP通讯协议 3.TCPP通讯协议 1.概述 1.在java中网络通讯作为Socket(插座)通讯,要求两台都必须安装socket. 2.不同的 ...
- JDK学习---深入理解java中的HashMap、HashSet底层实现
本文参考资料: 1.<大话数据结构> 2.http://www.cnblogs.com/dassmeta/p/5338955.html 3.http://www.cnblogs.com/d ...
- 如何快速掌握plc或工控机与其他设备的modbus通讯协议?包括格式与实际过程 RT,本人从事工控行业多年,对于PLC与触摸屏也算比较熟悉,唯独对这个通讯协议比较难理解,请教高人指导,从什么地方开始下手,或者是说如何正确理解报文格式或正确写入
Modbus协议是OSI模型的第七层的应用层通讯协议,定义了不同类型设备间交换信息方式,以及信息的格式. Modbus的工作方式是请求/应答,每次通讯都是主站先发送指令,可以是广播,或是向特定从站的单 ...
- 理解java容器底层原理--手动实现HashMap
HashMap结构 HashMap的底层是数组+链表,百度百科找了张图: 先写个链表节点的类 package com.xzlf.collection2; public class Node { int ...
- 《深入理解JAVA虚拟机》笔记1
java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...
- 【Java】「深入理解Java虚拟机」学习笔记(4)- 类文件结构
我为什么喜欢Java,另一个重要原因就是跨平台,WORA. 程序员是爽了,但肯定有人要为你遮风挡雨,解决WORA的基石就是字节码+虚拟机. ♣Tip 其实这里存在两种无关性,一是平台无关性.另一个是语 ...
- MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制
最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...
随机推荐
- Docker UnicodeEncodeError: 'ascii' codec can't encode characters in position
在容器里查询nova服务的时候字符集报错问题留档及处理方法: 1.在容器里执行nova list --all 提示 [root@stack1 region_01]# nova list --all E ...
- 关于mybatisPlus一些坑,当条件为null时
1.TStaffDepart 属性有值是才匹配条件,会报错,相当于mybatis if 判断 eg:TStaffDepart staffDepart = new TStaffDepart();staf ...
- kali 系列学习09-Kali-linux设置ProxyChains
ProxyChains是Linux和其他Unices下的代理工具.它可以使任何程序通过代理上网,允许TCP和DNS通过代理隧道,支持HTTP.SOCKS4和SOCKS5类型的代理服务器,并且可配置多个 ...
- 关于Folx一些使用方面的问题详细解答
Folx作为一款的专业的Mac系统文件下载工具,相信大家或多或少都对它的主打功能,如智能限速.制定计划任务.直链文件下载等功能有所了解,但是对于它的一些相对少见.冷门的功能,却不太熟悉. 下面小编将通 ...
- macbook上安装虚拟机软件如何操作?
很多用户都不太熟悉苹果系统,用惯了Windows之后再过渡到MacOS难免会有些不习惯.为了使我们又可以用回那些熟悉的Windows应用,比较常见的办法就是安装macbook虚拟机.下面小编就教大家一 ...
- SFTP 连接服务器下载文件方法采坑说明
本篇博客主要记录请求SFTP服务器的一些方法采坑情况. 采坑的方法说明: 1. cd():这个方法用于进入某个目录下. 默认情况,当连接SFTP服务器成功后直接进入用户目录,比如我连接自己本机SFTP ...
- Elasticsearch实现搜索推荐词
本篇介绍的是基于Elasticsearch实现搜索推荐词,其中需要用到Elasticsearch的pinyin插件以及ik分词插件,代码的实现这里提供了java跟C#的版本方便大家参考. 1.实现的结 ...
- 牛客练习赛67 D牛妹爱数列 题解(dp)
题目链接 题目大意 给你一个长为n的01串,要你进行最少的操作使得这01串变成全为0,求最少操作次数 有两种不同类型的操作 1:翻转一个前缀 2:单调翻转一个元素 题目思路 居然是一个dp,标程讲的很 ...
- C语言讲义——内联函数
如果一些函数被频繁调用,不断地有函数入栈(Stack),会造成栈空间的大量消耗. 对应这种问题,可以使用内联函数(inline). 编译器会将内联函数的代码整段插入到调用的位置. #include & ...
- Java集合【1】--俯瞰java集合分类
目录 (一) java集合分类 (1) Iterable接口 1. 内部定义的方法 1.1 iterator方法 1.2 forEach方法 1.3 spliterator方法 2. Collecti ...