Java NIO SocketChannel简述及示例_niosocketchannel-程序员宅基地

技术标签: SocketChannel  java  nio  socket  高并发socket  

JAVA NIO之SocketChannel

1. 简述

NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道

2. 特点

1. 非阻塞
2. 单线程
3. 轮循

3. 解决问题

当我们使用socket进行通信时, 建立后的链接需保持通信状态则不可关闭, 会启动分线程进行并发通信, 其中大部分时间会是阻塞状态,等待接收消息, 会造成大量的线程阻塞, 对于cpu需要维护线程之间的切换和调用, 在高并发是性能非常低, 因此使用nio可有效的提高效率

4. demo功能

客户端每隔2秒发送一次数据到服务器端, 服务器在其消息前加hello并回复客户端信息

  1. server端使用非阻塞模式单线程轮循的方式进行与client端通信处理
  2. client端使用2个线程进行运作, 一个线程用于定时发送消息到server端, 另一个线程用于读取server端消息

5. 工作原理

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方法进行轮循挑选触发事件的链接, 使用单线程即可完成与客户端的通信过程, 极大的提高了服务器端的性能, 在高并发时非常实用

6. 代码示例

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));
            
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38013624/article/details/99614590

智能推荐

(赠源码)python+django+Mysql上课点名系统03391-计算机毕业设计-程序员宅基地

文章浏览阅读112次。对于本上课点名系统的设计来说,它主要是采用后台采用了B/S的结构,它是应用mysql数据库,python等技术动态编程以及数据库进行努力学习和大量实践,并运用到了整个系统的设计当中,具体根据网上上课点名系统的现状来进行开发的,具体根据学生需求实现网上上课点名系统网络化的管理,各类信息有序地进行存储,进入上课点名系统页面之后,方可开始操作主控界面,系统功能包括管理员服务端:后台首页、系统用户(管理员、任课老师、学校领导、班主任、学生注册)、模块管理(课程类别、课程信息、课程签到、公告信息、签到提醒)。

移动端之禁止长按复制文字(兼容ios)_vue ios 禁止复制-程序员宅基地

文章浏览阅读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 禁止复制

Pycharm Debug调试(纯干货)-程序员宅基地

文章浏览阅读3w次,点赞65次,收藏374次。内容目录(原文见公众号python宝或www.xmmup.com)一、打断点二、代码调试三、界面小图标介绍四、控制台介绍# 数字转换为大写人民币import sysimport io..._pycharm debug

android MediaPlayer + GLSurfaceView播放视频_mediaplayer glsurfaceview-程序员宅基地

文章浏览阅读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 早期积极主动学习,占领先机。_大模型提示词

Description Resource Path Location Type The superclass "javax.servlet.http.HttpServlet" was not foun_"descriptionresourcepathlocationtype the superclas-程序员宅基地

文章浏览阅读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"

随便推点

纯C语言完整代码操作单链表(初始化、插入、删除、查找...)-程序员宅基地

文章浏览阅读901次,点赞3次,收藏10次。C语言操作单链表

实战打靶集锦-027-SoSimple1_sosimple 写入试验场-程序员宅基地

文章浏览阅读1.6k次,点赞32次,收藏47次。本文简单记录了博主的一次打靶经历,涉及wordpress扫描与爆破、social-warfare远程代码执行漏洞、sudo命令提权等_sosimple 写入试验场

用opencv的dnn模块做yolov5目标检测_opencv yolov5-程序员宅基地

文章浏览阅读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

3的倍数(暴力搜索)_3的倍数csdn-程序员宅基地

文章浏览阅读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

【腾讯优测干货分享】如何降低App的待机内存(二)——规范测试流程及常见问题...-程序员宅基地

文章浏览阅读71次。本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/806TiugiSJvFI7fH6eVA5w作者:腾讯TMQ专项测试团队导语最近小优听说,隔壁的腾讯TMQ团队出了一本新书——《移动App性能评测与优化》,便借阅了一本,读完感觉写得确实很赞。这本书体系化地介绍了移动应用性能评测与优化的方方面面,如内存,电量..._如何降低app的待机内存

Texlive2020+Texstudio2.12.22资源,附安装教程和书-程序员宅基地

文章浏览阅读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的分享文件截图总结如果链接..