实现一个基于nio的discard server

写在前面

源码 。
为了能够进一步的熟悉下nio相关的api操作,本文来实现一个基于nio的discard server。

discard server的意思是,server接收到来自client的一个消息之后,直接就将连接关闭,即discard。

1:正戏

1.1:server

package com.dahuyou.nio.discard.server.server;import java.net.InetSocketAddress;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.util.Iterator;/*** nio discard server服务端*/
public class NioDiscardServer {public static void main(String[] args) throws Exception {// 1:打开选择器Selector selector = Selector.open();// 2:获取通道ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();// 3:设置为非阻塞(阻塞了也就失去了nio的意义了!并且只有非阻塞才支持绑定事件)serverSocketChannel.configureBlocking(false);// 4:绑定链接serverSocketChannel.bind(new InetSocketAddress(18899));// 5:注册io事件serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);System.out.println("服务器启动成功");// 6:阻塞方式轮询感兴趣的通道事件(IO就绪)while (selector.select() > 0) {// 7:获取封装事件+通道的选择键的集合Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();while (iterator.hasNext()) {// 8:获取某个选择键进行处理SelectionKey selectionKey = iterator.next();// 9:判断具体的事件,并进行处理if (selectionKey.isAcceptable()) {System.out.println("新连接来了:" + selectionKey.channel());// 10:就绪事件,获取客户端的链接(一个个来建立链接???可能不是个问题!!!不太明白这里为什么// 这么写???)SocketChannel socketChannel = serverSocketChannel.accept();// 11:设置为非阻塞socketChannel.configureBlocking(false);// 12:注册到选择器监听相关事件
//                    SelectionKey register = socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE | SelectionKey.OP_CONNECT);socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE | SelectionKey.OP_CONNECT);}// 可写事件if (selectionKey.isWritable()) {System.out.println("可写啦," + selectionKey.channel());}if (selectionKey.isConnectable()) {System.out.println("连接成功啦," + selectionKey.channel());}if (selectionKey.isReadable()) {System.out.println("数据可读啦," + selectionKey.channel());// 13:获取通道,为读取数据做准备啦SocketChannel socketChannel = (SocketChannel) selectionKey.channel();// 14:读取数据啦ByteBuffer byteBuffer = ByteBuffer.allocate(1024);int length = 0;while ((length = socketChannel.read(byteBuffer)) > 0) {// 转成读模式byteBuffer.flip();System.out.println("读取到数据:" + new String(byteBuffer.array(), 0, length));// 恢复成写模式(这里其实不用的,但当个好习惯吧!)byteBuffer.clear();}// 读完消息了,就discard(discard server的体现指出)socketChannel.close();}// 15:移出选择键,防止重复处理iterator.remove();}}System.out.println("discard 啦!!!!!!!!!!!!");// 关闭链接(这里应该是执行不到的,因为selector.select啦)serverSocketChannel.close();}}

代码socketChannel.close();在read消息后,就discard啦!另外,关键步骤的代码看带标号的。

1.2:client

package com.dahuyou.nio.discard.server.client;import io.netty.buffer.ByteBuf;import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;public class NioDiscardClient {public static void main(String[] args) throws Exception {InetSocketAddress inetSocketAddress= new InetSocketAddress("127.0.0.1", 18899);// 1:获取通道SocketChannel socketChannel = SocketChannel.open(inetSocketAddress);// 2:切换成非阻塞socketChannel.configureBlocking(false);// 不断自旋,等待连接完成while (!socketChannel.finishConnect()) {}System.out.println("链接server成功");// 3:创建缓冲区,填充数据,并向通道写入数据ByteBuffer byteBuffer = ByteBuffer.allocate(1024);byteBuffer.put("hello discard server".getBytes());// 转成读模式,开始读数据写出去byteBuffer.flip();socketChannel.write(byteBuffer);System.out.println("向server写数据done");// 关了,释放资源,好习惯socketChannel.shutdownOutput();socketChannel.close();}
}

1.3:运行测试

在这里插入图片描述

写在后面

参考文章列表

使用NIO实现Discard服务器的实践案例 。

使用NIO实现Discard服务器的实践案例 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1543651.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【ollama 在linux 上离线部署 本地大模型】

本文继续来讲如何在linux上部署离线本地智能大模型&#xff0c;前篇如下&#xff1a;window上部署离线大模型 首先还是安装ollama linux版本&#xff0c;如果完全离线的话&#xff0c;可以从github上下载一个linux 版本的压缩包传上去 git hub上搜索ollama 找到右下角 找到li…

变量与变量提升【JavaScript】

一、变量 在 JavaScript 中&#xff0c;变量 是用于存储数据的容器。你可以使用变量来保存和操作各种类型的数据。其中&#xff0c;声明变量、变量初始化和变量赋值是三个相关但不同的概念。下面是它们之间的区别与联系&#xff1a; 1. 变量声明 变量声明是定义变量的过程。它…

基于SpringBoot+Vue+MySQL的教学资料管理系统

系统展示 管理员后台界面 教师后台界面 系统背景 在当今信息化高速发展的时代&#xff0c;教育机构面临着日益增长的教学资料管理需求。为了提升教学管理的效率&#xff0c;优化资源的配置与利用&#xff0c;开发一套高效、便捷的教学资料管理系统显得尤为重要。基于SpringBoot…

出海企业如何利用海外云手机开展业务?

随着全球化的持续推进&#xff0c;越来越多的企业将目光投向海外市场。然而&#xff0c;面对不同国家的网络环境、政策限制以及文化和语言的差异&#xff0c;出海企业在拓展海外业务时遇到了许多障碍。海外云手机作为一种创新的解决方案&#xff0c;为企业提供支持和帮助。 海外…

Spring Data Rest 远程命令执⾏命令(CVE-2017-8046) 靶场攻略

靶场环境 vulhub/spring/CVE-2017-8046 漏洞复现 1. 访问 http://47.113.231.0:8080/customers/1 2.抓取数据包&#xff0c;使⽤PATCH请求来修改 PATCH /customers/1 HTTP/1.1 Host: 47.113.231.0:8080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en U…

微信抢红包设计

包几个红包&#xff0c;发红包的总金额塞钱进红包&#xff0c;弹出支付的界面&#xff0c;支付完之后就会被发到 群里抢拆红包&#xff0c;才是真正的抢红包 红包金额怎么分配 每个人至少抢到1分钱人数抢到的金额之和就应该是红包的总金额一个人抢的红包不应该极度的大&#…

选择排序(C语言实现)

目录 1.基本思想 2.代码实现 代码思路 代码实现 代码测试 3.复杂度分析 1&#xff09;时间复杂度 2&#xff09;空间复杂度 4.特性总结 1.基本思想 选择排序是一种简单直观的比较排序算法。该算法的基本思想是在每一轮中选出当前未排序部分的最小&#xff08;或最大&a…

xv6讲解(2) Operating system organization

这一章 讲操作系统是如何实现进程并发、进程隔离和进程交互(multiplexing isolation and interaction) 进程并发&#xff1a; 操作系统需要同时支持多个进程。如一个进程可以使用fork来启动新的进程。对计算机的资源进行时间共享&#xff0c;确保所有进程都有机会执行。 进程…

AI大模型日报#0923:李飞飞创业之后首个专访、华为云+腾讯音乐发布昇腾适配方案

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;、“智谱AI”&#xff08;glm-4-0520&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅…

计算机毕业设计 | SSM 凌云招聘平台 求职问答审批系统(附源码)

1&#xff0c;绪论 人力资源是企业产生效益、创造利润的必不可少的、最重要的资源。人作为人力资源的个体可看作是一个承载着有效知识、能力的信息单元。这样的信息单元可看作是一个为企业产生价值和利润的个体。从而使得这样的信息单元所具有的信息就是一个有价值的信息。 校…

【Java】JVM基本组成

一、JDK、JRE、JVM JDK&#xff1a;全称 “Java Development Kit” Java 开发工具包&#xff0c;提供 javac编译器、jheap、jconsole 等监控工具; JRE&#xff1a;全称 “Java Runtime Environment” Java 运行环境&#xff0c;提供 class Library 核心类库JVM; …

java项目之基于springboot的医院资源管理系统源码

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的医院资源管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

JavaEE: 深入探索TCP网络编程的奇妙世界(六)

文章目录 TCP核心机制TCP核心机制九: 面向字节流TCP核心机制十: 异常处理 小小的补充(URG 和 PSH)~TCP小结TCP/UDP 对比用UDP实现可靠传输(经典面试题) 结尾 TCP核心机制 上一篇文章JavaEE: 深入探索TCP网络编程的奇妙世界(五) 书接上文~ TCP核心机制九: 面向字节流 TCP是面…

GUI编程之MATLAB入门详解(01)

⛄前言 图形用户界面的设计是MATLAB的核心应用之一。当用户与计算机之间或用户与计算机程序之间进行交互操作时&#xff0c;舒服高效的用户接口功能则会对用户产生极大的吸引力。图形用户界面&#xff08;GUI&#xff09;则通过窗口、图标、按钮、菜单、文本等图形对象构成用户…

瑞璟湾居安居房附近的工地免费停车位探寻

从前海卓越骑行30分钟就可以达到瑞璟湾居安居房&#xff0c;顺着前海的繁华沿途过来就越发觉得瑞璟湾居的地段真的是王炸哈。虽然安居房均价45745.43元/平方米&#xff0c;但是对比附近商品房和宝安现代化的城市规划&#xff0c;感觉这个楼盘应该可以快速去化。虽然我也是安居房…

如何使用cmd命令查看本机电脑的主机名?

1、按键盘win R 键&#xff0c;输入cmd&#xff0c;然后按一下【回车】 2、输入ping -a localhost , 然后按下【回车】 3、如下Ping 后面的DESKTOP-ALB9JF7即是本机电脑的【主机名】

面向对象程序设计——mapの简析

1.map的定义 Key就是map底层关键字的类型&#xff0c;T是map底层value的类型&#xff0c;set默认要求Key⽀持⼩于⽐较&#xff0c;如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数&#xff0c;map底层存储数据的 内存是从空间配置器申请的。⼀般情况下&#xff0c…

OpenBayes 教程上新|让虚拟偶像活起来!LivePortrait 实现超逼真表情迁移

过去&#xff0c;使用单一图像生成动态视频效果需要复杂的动画技术和大量的手工操作。特别是在控制眼睛和嘴唇等细节上&#xff0c;耗时且难以实现逼真的同步效果。 LivePortrait 在最新版本中通过精确的画像编辑和视频编辑等功能&#xff0c;极大地简化了这一过程。创作者可以…

调度_命令行_环境变量

linux的进程调度算法 饥饿问题 新建进程/时间片结束进程&#xff0c;若放回active&#xff0c;很可能该进程优先级太高&#xff0c;下一个还是执行该进程&#xff0c;导致不断执行同一进程&#xff0c;各进程调度不均衡。 饥饿问题解决 新建进程不能到active&#xff0c;要到…

论文大杀器!分享4款ai论文写作工具软件

在当今学术研究和论文写作领域&#xff0c;AI技术的应用已经变得越来越普遍。这些工具不仅能够提高写作效率&#xff0c;还能帮助研究人员生成高质量的论文内容。本文将重点介绍四款优秀的AI论文写作工具&#xff0c;并特别推荐千笔-AIPassPaper。 一、千笔-AIPassPaper 传送门…