理解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 ...
随机推荐
- nginx安装 linux
1.安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.创建一个文件夹 cd /usr/local m ...
- centos7 安装telnet
SSH Secure Shell 3.2.9 (Build 283)Copyright (c) 2000-2003 SSH Communications Security Corp - http:// ...
- Spring源码之事务(一)— TransactionAutoConfiguration自动配置
总结: 在ConfigurationClassParser#parse()中会对deferredImportSelectorHandler进行处理(在处理@ComponentScan 自己所写@Com ...
- mds的cpu占用问题分析以及解决办法
前言 mds是ceph里面处理文件接口的组件,一旦使用文件系统,不可避免的会出现一种场景就是目录很多,目录里面的文件很多,而mds是一个单进程的组件,现在虽然有了muti mds,但稳定的使用的大部分 ...
- CTF练习(1)这是一张单纯的图片?
1.练习平台http://123.206.31.85/challenges 2.图片下载后放进WInhex 最后安利一个 CTF资源库|CTF工具包|CTF工具集合 网站,里面工具很全,很方便 ...
- php读取Excel文件数据
首先先下载 PHPExcel 脚本之家下载地址:https://www.jb51.net/codes/194070.html 然后把文件丢到php脚本同级目录里面 在php文件里面写下以下代码即可 & ...
- bWAPP----PHP Code Injection
PHP Code Injection 主要代码 1 <div id="main"> 2 3 <h1>PHP Code Injection</h1> ...
- FL studio系列教程(一):什么是FL水果音乐制作软件
如今,越来越多的音乐人选择使用音乐制作软件来进行音乐的创作,一台电脑.一款软件以及一个外接MIDI就是一个小型的音乐工作站.FL Studio成了音乐界萌新的首选,目前最新的版本为FL Studio2 ...
- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的错误问题
最近想再购买一台虚拟服务器做项目测试,之前在西部数码购买的已经过期了,在同事的推荐下去搬瓦工购买了一台服务器,听他介绍在这里购买服务器很便宜($19.99/年)而且还是国外的,看着相比之前的确实挺便宜 ...
- CentOS 7防火墙的关闭与开启
(1)CentOS 7.0默认使用的是firewall作为防火墙:若没有启用iptables 作为防火墙,则使用以下方式关闭防火墙: systemctl stop firewalld.service ...