技术标签: SocketChannel java nio socket 高并发socket
NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道
1. 非阻塞
2. 单线程
3. 轮循
当我们使用socket进行通信时, 建立后的链接需保持通信状态则不可关闭, 会启动分线程进行并发通信, 其中大部分时间会是阻塞状态,等待接收消息, 会造成大量的线程阻塞, 对于cpu需要维护线程之间的切换和调用, 在高并发是性能非常低, 因此使用nio可有效的提高效率
客户端每隔2秒发送一次数据到服务器端, 服务器在其消息前加hello并回复客户端信息
1. client注册SocketChannel到server中
第一步: 创建ServerSocketChannel服务器端并绑定通信端口8000, 存入selector挑选器keys中, 并注册accept事件
第二步: 客户端链接服务器的8000端口, 与服务器端进行通信,触发服务器端的accept事件
第三步: 挑选器挑选出本次需要执行的keys (ServerSocketChannel)存入挑选结果及selectedKeys中, 等待执行
第四步: 执行ServerSockerChannel.accept处理方式, 即获取与客户端client1通信的SocketChannel对象, 并未其注册read事件, 存储到挑选器中
第五步: 执行完本次挑选的结果集后, 清空selectedKeys集合即可
后续客户端连接服务器便重复第二,三,四步即可
2. client与server端的通信
第一步: client1和client3发送消息到server, 触发服务器端的read事件
第二步: 挑选器挑选出本次需要执行的keys (ServerSocketChannel)存入挑选结果及selectedKeys中, 等待执行
第三步: 遍历筛选出来的client1和client2的链接, 分别读取数据, 并返回响应消息写入到SocketChannel中
第四步: client通过SocketChannel接收server端发送的消息, 进行处理
重复以上步骤即可完成server和client端的通信
3. 特点
在server端, 使用selector的select方法进行轮循挑选触发事件的链接, 使用单线程即可完成与客户端的通信过程, 极大的提高了服务器端的性能, 在高并发时非常实用
1. ServerChannel
package pro.nio.socket;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;
/**
* nio之socket通信服务器端
*/
public class ServerChannel {
public static void main(String[] args) throws IOException {
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 开启挑选器
Selector selector = Selector.open();
// 开启ServerSocketChannel通道
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress("localhost", 8000));
文章浏览阅读112次。对于本上课点名系统的设计来说,它主要是采用后台采用了B/S的结构,它是应用mysql数据库,python等技术动态编程以及数据库进行努力学习和大量实践,并运用到了整个系统的设计当中,具体根据网上上课点名系统的现状来进行开发的,具体根据学生需求实现网上上课点名系统网络化的管理,各类信息有序地进行存储,进入上课点名系统页面之后,方可开始操作主控界面,系统功能包括管理员服务端:后台首页、系统用户(管理员、任课老师、学校领导、班主任、学生注册)、模块管理(课程类别、课程信息、课程签到、公告信息、签到提醒)。
文章浏览阅读1.2k次,点赞2次,收藏2次。移动端之禁止长按复制文字在css中设置以下即可 *{ -webkit-touch-callout:none; /*系统默认菜单被禁用*/ -webkit-user-select:none; /*webkit浏览器*/ -khtml-user-select:none; /*早期浏览器*/ -moz-user-select:none;/*火狐*/ -ms-user-select:none; /*IE10*/ user-select:none;}在添加完_vue ios 禁止复制
文章浏览阅读3w次,点赞65次,收藏374次。内容目录(原文见公众号python宝或www.xmmup.com)一、打断点二、代码调试三、界面小图标介绍四、控制台介绍# 数字转换为大写人民币import sysimport io..._pycharm debug
文章浏览阅读4.7k次。1、配置layout<?xml version="1.0" encoding="utf-8"?><LinearLayout ="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >_mediaplayer glsurfaceview
文章浏览阅读5.2k次,点赞76次,收藏106次。本文从战略(宏观)和战术(微观)两个层次讲解提示词技巧。希望大家能够掌握常见的提示词技巧,能够在 AI 早期积极主动学习,占领先机。_大模型提示词
文章浏览阅读2.4k次,点赞3次,收藏3次。建了一个简单web项目,但是项目出了一个Description Resource Path Location TypeDescription Resource Path Location TypeThe superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path index.jsp /s..._"descriptionresourcepathlocationtype the superclass \"javax.servlet.http.h"
文章浏览阅读901次,点赞3次,收藏10次。C语言操作单链表
文章浏览阅读1.6k次,点赞32次,收藏47次。本文简单记录了博主的一次打靶经历,涉及wordpress扫描与爆破、social-warfare远程代码执行漏洞、sudo命令提权等_sosimple 写入试验场
文章浏览阅读7w次,点赞271次,收藏1.1k次。最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的。于是,我就想着编写一套用opencv的dnn模块做yolov5目标检测的程序。在编写这套程序时,遇到的bug和解决办法,在这篇文章里讲述一下。在yolov5之前的yolov3和yolov4的官方代码都是基于darknet框架的实现的,因此opencv的dnn模块做目标检测时,读取的是.cfg和.weight文件,那时候编写程序很顺畅,没有遇到bug。但是yolo_opencv yolov5
文章浏览阅读168次。牛客小白月赛20D 3的倍数题目链接算法分析n最大为15,范围比较小,所以直接来采用爆搜就行算法实现#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<math.h>using namespace std;int ch[20][30];//ch[i][j]记录第i个字符串中j的个数,j为字符转换后的数字int dp[30];/_3的倍数csdn
文章浏览阅读71次。本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/806TiugiSJvFI7fH6eVA5w作者:腾讯TMQ专项测试团队导语最近小优听说,隔壁的腾讯TMQ团队出了一本新书——《移动App性能评测与优化》,便借阅了一本,读完感觉写得确实很赞。这本书体系化地介绍了移动应用性能评测与优化的方方面面,如内存,电量..._如何降低app的待机内存
文章浏览阅读1.6k次,点赞21次,收藏6次。Texlive2020+Texstudio2.12.22资源,附安装教程和刘海洋latex入门使用说明书百度云地址文件截图![\[\]](https://img-blog.csdnimg.cn/20201031105628261.png#pic_center)总结百度云地址链接:https://pan.baidu.com/s/1w4ZdEHvgMBF2uURQmnAxXw提取码:6jga复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V1的分享文件截图总结如果链接..