java之socket编程(NIO)

2023-11-15

效果展示

原理分析

NIO: 非阻塞型 IO

自从 jdk 1.4 之后,增加了 nio 库,支持非阻塞型 IO 操作

代码展示

package NIO;

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * ClassName: NioServer <br/>
 * Description: <br/>
 * date: 2021/8/20 15:17<br/>
 *
 * @author yiqi<br />
 * @since JDK 1.8
 */
public class NioServer {
    //保存客户端连接
    static List<SocketChannel> channelList = new ArrayList<>();

    public static void main(String[] args) throws Exception {

        // 创建 NIO ServerSocketChannel,与 BIO ServerSocket 类似
        ServerSocketChannel serverSocket = ServerSocketChannel.open();
        serverSocket.socket().bind(new InetSocketAddress(9000));
        // 设置 ServerSocketChannel 为非阻塞
        serverSocket.configureBlocking(false);
        System.out.println("服务启动成功");

        while (true) {
            // 非阻塞模式 accept 方法不会阻塞,否则会阻塞
            // NIO 的非阻塞是由操作系统内部实现的,底层调用了 Linux 内核的 accept 函数
            SocketChannel socketChannel = serverSocket.accept();
            // 如果有客户端进行连接
            if (socketChannel != null) {
                System.out.println("连接成功");
                // 设置 SocketChannel 为非阻塞
                socketChannel.configureBlocking(false);
                // 保存客户端连接在 List 中
                channelList.add(socketChannel);
            }

            // 遍历连接进行数据读取
            Iterator<SocketChannel> iterator = channelList.iterator();
            while (iterator.hasNext()) {
                SocketChannel sc = iterator.next();
                ByteBuffer byteBuffer = ByteBuffer.allocate(128);
                // 非阻塞模式 read 方法不会阻塞,否则会阻塞
                int len = sc.read(byteBuffer);
                // 如果有数据,把数据打印出来
                if (len > 0){
                    System.out.println("接收到消息:" + new String(byteBuffer.array(),0,len));
                }else if (len == -1){
                    //当连接客户端 断开连接的时候返回值为 -1,没有传数据是 0
                    iterator.remove(); //这句话是移除当前序列
                    System.out.println("客户端断开连接");
                }
            }
        }
    }
}

缺点

虽然这种方式不阻塞了,但是,如果有10万个连接 可是只有 100 个在发数据,那你还是得遍历这10万个连接 来找到这发数据的100个,性能不好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java之socket编程(NIO) 的相关文章

  • 获取 UndeclaredThrowableException 而不是我自己的异常

    我有以下代码 public Object handlePermission ProceedingJoinPoint joinPoint RequirePermission permission throws AccessException
  • 如何将log4j日志文件更改为utf8

    我收到了一个使用 log4j 作为记录器应用程序的代码 如何为其生成 UTF8 日志文件 log4j 创建的日志文件目前为 ASCII 格式 我已经尝试过以下操作 按照以下说明设置日志文件的文件编码 vi current set bomb
  • 如何在itext中设置自定义颜色?

    感谢您花时间回答我的问题 我正在使用 Java 中的 iText 生成 PDF 文档 我需要将表的列标题设置为与值列中的颜色不同的颜色 我有来自 Photoshop 的颜色十六进制值 我正在使用带有块和段落的 PdfPTable 除了 Ba
  • 如何处理java.util.concurrent.ExecutionException异常?

    我的代码的某些部分抛出 java util concurrent ExecutionException 异常 我该如何处理这个问题 我可以使用 throws 子句吗 我对java有点陌生 这取决于您的任务关键程度Future是为了如何处理它
  • Tomcat 7 停止接收 HTTP 请求

    我有一个Tomcat 7接收大量数据的服务器GET 要求 这种方法在一段时间内效果很好 然后突然停止工作 7 8 小时后 当它停止工作时 我收到此错误 五月 06 2015 12 47 58 AM org apache coyote htt
  • Spring MVC 应用程序可以是多线程的,即使它的 servlet 不是吗?

    当您谈论 Spring 应用程序是多线程时 您是否一定是指该应用程序中定义的 servlet 是否是多线程的 或者即使应用程序中的 servlet 不是多线程 Spring 应用程序也可以配置为多线程吗 不再支持单线程 servlet 它们
  • 在 Postgres 中为特定查询设置 work_mem

    我正在使用一个委托给 JDBC 驱动程序的库PostgreSQL 而且有些查询非常复杂 需要更多内存 我不想设置work mem对于所有查询来说都是大的 只是这个子集 问题是执行以下代码会导致错误 pseudo code for what
  • Java程序验证signtool签名的数字签名

    我已经使用 SignTool 对文件 exe 或 dll 不是 jar 文件 进行了数字签名 Signtool还可以验证数字签名 但我的要求是使用java程序检查由signtool签名的文件的数字签名 我在互联网上搜索但没有找到任何信息 您
  • 使用 IntentService 使用 Camera2 拍照

    我正在尝试创建一个可以拍照但不显示预览的应用程序 使用本教程 https www youtube com watch v oPu42I0HSi4 https www youtube com watch v oPu42I0HSi4如果我使用和
  • 如何暂停程序直到按下按钮?

    我使用从 jframe 扩展的类 它有一个按钮 我在程序中使用它 我希望当在我的程序中运行 jframe 时我的整个程序暂停 直到我按下按钮 我该怎么做 in c getch 做这个 我想要一个这样的功能 通过睡眠暂停执行 http dow
  • 椭圆与椭圆如何相交?

    我用的是JAVA Ellipse2D s1 new Ellipse2D Float 0 0 100 100 System out println s1 intersects 99 30 100 100 应该返回 false 但它返回 tru
  • 为什么ArrayList没有getSize()而不是size()?

    我在一些 JSP 页面中大量使用 ArrayList 我想像这样访问 ArrayList myArrayList size 但由于对象必须符合 JavaBean 标准 其中myArrayList getMyPropertyName is m
  • 如何更改使用 Google ReCaptcha 版本 2 时的错误消息?

    当为 Google ReCaptcha 版本 2 选择多张照片时 会显示以下错误消息 需要多个正确的解决方案 请解决更多 如何将错误消息更改为我网站上的自定义消息 这是图像 我认为不可能在服务器端 在谷歌 进行 这可以在客户端通过利用 js
  • Android Studio安装JDK错误

    In Android Studio I am facing bellow error 当我按下时会显示此弹出窗口Alt Enter对于缺少的类 符号 当我点击 setup SDK 时 它显示两个选项 1 8 Java版本 1 8 0 60
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • spring-hibernate 花费更多时间的任何原因?

    目前 我正在春季和冬眠期间从事一个项目 我来到这里 获取记录并在 JSP 中显示这些记录需要更多时间 我在各处都保留了时间戳 以查看哪里花费了更多时间 Time HomeController start 2014 07 09 18 58 5
  • 从 Spring 启动运行 Java 类

    我使用的是Java8和Spring4 3 1 我有一个 Java Spring 应用程序托管由浏览器和移动应用程序客户端访问的 RESTfult 服务 其次 我编写了一个侦听事件的聊天服务器 socket io 来自客户 该聊天服务器正在从
  • 为什么我得到:没有有效的 JFX 运行时

    我有一个使用 java 1 6 编译并使用 jnlp webstart 运行的现有应用程序 如果我使用 JRE 1 6 从客户端运行此应用程序 一切都会很好 但是 当我使用 java JDK 7 编译代码并使用 JRE 1 7 67 运行客
  • SQL准备语句如何通过多个可能的菜单选择进行选择?

    所以我有 4 个菜单选择 产品 位置 课程类型和类别 所有这些都可以为空 使用 JSF 编程 但这应该与这个问题无关 因为它是一个 SQL 问题 菜单选择将向托管 bean 发送用户选择的变量 并使用准备好的语句使用用户选择的菜单中的信息
  • 尝试 Catch 性能 Java

    当捕获异常而不是进行检查时 try catch 需要多长时间 以纳秒为单位 假设消息具有用于查找的 HashMap 类型性能 try timestamp message getLongField MessageField TIMESTAMP

随机推荐

  • TCP如何实现可靠传输

    TCP的特点 面向字节流 面向连接 可靠传输 可靠传输的实现 1 确认应答机制 对收到的信息给发送方发送报文确认收到数据 2 超时重传机制 等待200ms没有收到接收方的确认应答则说明数据丢失 那么就要进行重新发送 3 序号 确认号 告诉发
  • Flutter利用ScrollController获取、控制滚动组件的滚动位置

    Flutter 中的可滚动组件主要由三个角色组成 Scrollable Viewport 和 Sliver 我们如何利用ScrollController来获取滚动组件的滚动位置 1 先构建一个ScrollController ScrollC
  • Python未来的发展前景到底如何?

    对于程序员而言 了解编程语言的发展趋势 有助于个人职业成长 而对于想要入行IT的新人而言 最大的疑惑大多来自于不知道该选择哪门编程语言发展前景更好 有人让你学Java 因为使用的人最多 有人让你学Python 因为简单易学 是人工智能时代的
  • flutter 实现一个图片选择控件

    在最近的开发中 需要做一个选择图片 包括拍照和相册选择 然后上传的功能 我们的项目是iOS原生和flutter混编的 首先用flutter实现这个页面 选择了第三方插件image picker 下面先看一下效果图 下面我们开始一步一步实现这
  • Netty和Tomcat的区别、性能对比

    文章目录 一 Netty和Tomcat有什么区别 二 为什么Netty受欢迎 三 Netty为什么并发高 一 Netty和Tomcat有什么区别 Netty和Tomcat最大的区别就在于通信协议 Tomcat是基于Http协议的 他的实质是
  • 区块链入门学习笔记(二)

    1 什么是区块链 Blockchain 区块链是由节点参与的分布式数据库系统 区块链是由一串使用密码学方法产生的数据块组成的 每个区块都包含了上一个区块的哈希值 从创始区块开始连接到当前区 块 从而形成块链 链 指的是一个庞大而完整的数据库
  • 内窥镜去反光的论文整理

    文章目录 内窥镜去反光的论文整理 Detection and correction of specular reflections for automatic surgical tool segmentation in thoracosco
  • YSlow--Web前端性能测试工具

    1 介绍 YSlow是Yahoo发布的一款基于FireFox的插件 这个插件可以分析网站的页面 并告诉你为了提高网站性能 如何基于某些规则进行优化 它可以分析任何网站 并为每一个规则产生一个整体报告 如果页面可以进行优化 则YSlow会列出
  • mysql workbench 错误  Error Code: 1046. No database selected Select the default DB to be used by doubl

    mysql workbench 错误 Error Code 1046 No database selected Select the default DB to be used by double clicking its name in
  • mac 本地打安卓包 platforms;android-28 Android SDK Platform 28

    A newer version of the Android SDK is required To update run Users xxx Library Android sdk tools bin sdkmanager update 转
  • 自己理解的智能指针

    看安卓内核 第一章就碰到智能指针了 看了网上的一些文章 自己实践了一下 自己的体会 普通指针直接为某个具体类型分配空间 对该空间的管理直接由指针来操作 T p new T t 智能指针相当于对该空间进行封装 智能指针实际是一个类 share
  • SPOJ QTREE4 Query on a tree IV (边分治 + 堆)

    题意 给定一棵树 节点有黑白两种颜色 有正负的边权 有两种操作 一种是修改反转某个节点的颜色 另一种是询问树上最远的两个白色节点的距离 思路 树剖 堆维护的代码还是没敢去码 以后再补了 这里用边分治 堆来维护 边分治的优点比起点分支来说 优
  • 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。

    编写一个程序 提示用户输入一周工作的小时数 然后打印工资总额 税金和净收入 首先做如下假设 基本工资 10 00美元 小时 加班 超过40小时 1 5倍的时间 税率 前300美元为15 续150美元为20 余下的为25 用 define定义
  • 【马士兵】Python基础--10(集合)

    Python基础 10 文章目录 Python基础 10 什么是集合 集合的创建 集合的相关操作 集合间的关系 集合的数据操作 集合生成式 列表 字典 元组 集合总结 什么是集合 集合的创建 集合中元素不允许重复 集合中元素无序 s 23
  • Android 去掉Button自带边框

    android background null 将边框去掉
  • Vue - 安装less-loader

    文章目录 直接安装 遇到问题 与webpack版本不兼容 查看当前使用webpack版本 查看所有webpack版本 查看less loader历史版本 安装兼容版本less loader 直接安装 npm i less loader 下面
  • 字节流和字符流的转化

    Java中字节流和字符流是可以相互转换的 OutputStreamWriter 将字节输出流转换成字符输出流 是 writer 的子类 InputStreamReader 将字节流转换成字符输入流 是Reader 的子类 一般操作输入输出内
  • AOP JoinPoint中的方法

    获取参数的值数组 Object args point getArgs 1 参数的值 获取目标对象 被加强的对象 Object target point getTarget 获取signature 该注解作用在方法上 强转为 MethodSi
  • MySQL卸载不干净回不到初始安装页面(MySQL Connector Net卸载不了),重装报错Database initialization failed等问题解决办法

    首先 这篇文章适合 1 常规卸载方法无法卸载干净导致重装始终回不到初始安装页面 即回不到下图初始状态 始终是welcome back 这部分我会单独讲一下MySQL Connector Net卸载不了的问题 2 重装过程中Database
  • java之socket编程(NIO)

    效果展示 原理分析 NIO 非阻塞型 IO 自从 jdk 1 4 之后 增加了 nio 库 支持非阻塞型 IO 操作 代码展示 package NIO import java net InetSocketAddress import jav