NIO基本编写
一、编写server端
1 public class Server implements Runnable{
2 //1 多路复用器(管理所有的通道)
3 private Selector seletor;
4 //2 建立缓冲区
5 private ByteBuffer readBuf = ByteBuffer.allocate(1024);
6 //3
7 private ByteBuffer writeBuf = ByteBuffer.allocate(1024);
8 public Server(int port){
9 try {
10 //1 打开路复用器
11 this.seletor = Selector.open();
12 //2 打开服务器通道
13 ServerSocketChannel ssc = ServerSocketChannel.open();
14 //3 设置服务器通道为非阻塞模式
15 ssc.configureBlocking(false);
16 //4 绑定地址
17 ssc.bind(new InetSocketAddress(port));
18 //5 把服务器通道注册到多路复用器上,并且监听阻塞事件
19 ssc.register(this.seletor, SelectionKey.OP_ACCEPT);
20
21 System.out.println("Server start, port :" + port);
22
23 } catch (IOException e) {
24 e.printStackTrace();
25 }
26 }
27
28 @Override
29 public void run() {
30 while(true){
31 try {
32 //1 必须要让多路复用器开始监听
33 System.out.println("1");
34 this.seletor.select();
35 System.out.println("2");
36 //2 返回多路复用器已经选择的结果集
37 Iterator<SelectionKey> keys = this.seletor.selectedKeys().iterator();
38 //3 进行遍历
39 System.out.println("keys" + keys);
40 while(keys.hasNext()){
41 //4 获取一个选择的元素
42 SelectionKey key = keys.next();
43 //5 直接从容器中移除就可以了
44 keys.remove();
45 //6 如果是有效的
46 if(key.isValid()){
47 //7 如果为阻塞状态
48 if(key.isAcceptable()){
49 this.accept(key);
50 }
51 //8 如果为可读状态
52 if(key.isReadable()){
53 this.read(key);
54 }
55 //9 写数据
56 if(key.isWritable()){
57 //this.write(key); //ssc
58 }
59 // key.isConnectable()
60 }
61
62 }
63 } catch (IOException e) {
64 e.printStackTrace();
65 }
66 }
67 }
68
69 private void write(SelectionKey key){
70 //ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
71 //ssc.register(this.seletor, SelectionKey.OP_WRITE);
72 }
73
74 private void read(SelectionKey key) {
75 try {
76 //1 清空缓冲区旧的数据
77 this.readBuf.clear();
78 //2 获取之前注册的socket通道对象
79 SocketChannel sc = (SocketChannel) key.channel();
80 //3 读取数据
81 int count = sc.read(this.readBuf);
82 //4 如果没有数据
83 if(count == -1){
84 key.channel().close();
85 key.cancel();
86 return;
87 }
88 //5 有数据则进行读取 读取之前需要进行复位方法(把position 和limit进行复位)
89 this.readBuf.flip();
90 //6 根据缓冲区的数据长度创建相应大小的byte数组,接收缓冲区的数据
91 byte[] bytes = new byte[this.readBuf.remaining()];
92 //7 接收缓冲区数据
93 this.readBuf.get(bytes);
94 //8 打印结果
95 String body = new String(bytes).trim();
96 System.out.println("Server : " + body);
97
98 // 9..可以写回给客户端数据
99 } catch (IOException e) {
100 e.printStackTrace();
101 }
102
103 }
104
105 private void accept(SelectionKey key) {
106 try {
107 //1 获取服务通道
108 ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
109 //2 执行阻塞方法
110 SocketChannel sc = ssc.accept();
111 System.out.println("阻塞");
112 //3 设置阻塞模式
113 sc.configureBlocking(false);
114 //4 注册到多路复用器上,并设置读取标识
115 sc.register(this.seletor, SelectionKey.OP_READ);
116 } catch (IOException e) {
117 e.printStackTrace();
118 }
119 }
120
121 public static void main(String[] args) {
122
123 new Thread(new Server(8765)).start();;
124 }
二、编写Client端
1 public static void main(String[] args) {
2
3 //创建连接的地址
4 InetSocketAddress address = new InetSocketAddress("127.0.0.1", 8765);
5
6 //声明连接通道
7 SocketChannel sc = null;
8
9 //建立缓冲区
10 ByteBuffer buf = ByteBuffer.allocate(1024);
11
12 try {
13 //打开通道
14 sc = SocketChannel.open();
15 //进行连接
16 sc.connect(address);
17
18 while(true){
19 //定义一个字节数组,然后使用系统录入功能:
20 byte[] bytes = new byte[1024];
21 System.in.read(bytes);
22
23 //把数据放到缓冲区中
24 buf.put(bytes);
25 //对缓冲区进行复位
26 buf.flip();
27 //写出数据
28 sc.write(buf);
29 //清空缓冲区数据
30 buf.clear();
31 }
32 } catch (IOException e) {
33 e.printStackTrace();
34 } finally {
35 if(sc != null){
36 try {
37 sc.close();
38 } catch (IOException e) {
39 e.printStackTrace();
40 }
41 }
42 }
43
44 }
NIO基本编写的更多相关文章
- netty简单NIO模型
首先是使用java原生nio类库编写的例子,开发一套nio框架不简单,所以选择了netty,该例完成后,是netty举例. package com.smkj.netty; public class T ...
- 模拟实现 Tomcat 的核心模块:NIO,HTTP,容器和集群
如果你想看 Tomcat 源码但又无从入手,不妨从这个项目开始,代码量不多,但包含了 Tomcat 的核心处理流程,并且源码中有相当丰富的注释.相信通过此项目你能了解: NIO 基本编程.HTTP 协 ...
- JAVA BIO,NIO,Reactor模式总结
传统同步阻塞I/O(BIO) 在NIO之前编写服务器使用的是同步阻塞I/O(Blocking I/O).下面是一个典型的线程池客服端服务器示例代码,这段代码在连接数急剧上升的情况下,这个服务器代码就会 ...
- java基于P2P的聊天和文件传输实例
用java的NIO技术编写的 1. 支持聊天功能 2. 拖拽文件能够实现文件传输功能.也能够是目录 3. 启动时能够选择server端或client端启动 4. 本人原创.学习NIO和java的网络通 ...
- [Netty] - Netty IN ACTION(导言)
最近没什么事儿做,刚好看到有需要网络编程的知识,java中有NIO和IO两种不同的方式,但是NIO的编写比较麻烦,刚好找到一个成熟的网络框架Netty.接下来的一个月就准备将Netty IN ACTI ...
- [Netty] - Netty入门(最简单的Netty客户端/服务器程序)
Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...
- 【Netty】Netty简介及服务器客户端简单开发流程
什么是Netty Netty是一个基于Java NIO的编写客服端服务器的框架,是一个异步事件框架. 官网https://netty.io/ 为什么选择Netty 由于JAVA NIO编写服务器的过程 ...
- [转]Netty入门(最简单的Netty客户端/服务器程序)
Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...
- 解Bug之路-dubbo流量上线时的非平滑问题
前言 笔者最近解决了一个困扰了业务系统很久的问题.这个问题只在发布时出现,每次只影响一两次调用,相较于其它的问题来说,这个问题有点不够受重视.由于种种原因,使得这个问题到了业务必须解决的程度,于是就到 ...
- 【1w字+干货】第一篇,基础:让你的 Redis 不再只是安装吃灰到卸载(Linux环境)
Redis 基础以及进阶的两篇已经全部更新好了,为了字数限制以及阅读方便,分成两篇发布. 本篇主要内容为:NoSQL 引入 Redis ,以及在 Linux7 环境下的安装,配置,以及总结了非常详细的 ...
随机推荐
- Ubuntu安装微信/企业微信
1.安装Wine git clone https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu.gitcd deepin-wine-for-ubuntusud ...
- 常见的Native Crash类型,bug解决记录
APP调用Native的jar包接口出现闪退,仅仅settings应用,其他应用调用该包接口正常使用. 猜测1. jar包为64为,settings程序为32位,版本兼容性问题.(经验证,原因确实如此 ...
- linux dma
https://bootlin.com/pub/conferences/2015/elc/ripard-dmaengine/ripard-dmaengine.pdf https://biscuitos ...
- 阿里云IPSec的一些问题
1.阿里云IPSec无法进行多段连接单个IPSec连接 解决方案 在阿里云端需要如下操作 1.单个VPN网关下创建多个IPSec连接 连接属性一致 使用兴趣流模式.打开nat转换. 2段对2段 ...
- Java操作ES
一.ES基本概念 1. 节点:Elastic是一个分布式数据库,每个数据库实例是一个节点Node,一台服务器上可以有多个Node,可以多台服务器协同工作 2. 集群:一组节点Node构成一个集群Clu ...
- Windows下使用Fortran读取HDF5文件
需要用Fortran读取HDF5格式的GPM IMERG卫星降水文件,在已经安装HDF5库(参见VS2019+ Intel Fortran (oneAPI)+HDF5库的安装+测试 - chinago ...
- 互联网公司IT系统架构进化之路
一日,与一高手在茶馆聊天.他问道:在鞋厂剑派这两年,可习的什么高深的剑法?我不由一愣,细细想来,这两年每日练习的都是简单的劈砍动作和一些简练的套路.并没有去练什么高深的剑法.不过鞋厂剑派在江湖上也算小 ...
- 关于HTML5语义化
根据 HTML5 规范,在没有其他合适标签更合适时,才应该把 <b> 标签作为最后的选项. HTML5 规范声明:应该使用 <h1> - <h6> 来表示标题,使用 ...
- 使用CMD创建任意文件
C:\>fsutil file createnew 用法 : fsutil file createnew <文件名> <长度> 范例:fsutil file create ...
- 睿爸信奥-【临阵磨枪】练习赛(第一场)- T3
目录 题面 题目背景 输入格式 输出格式 思路 code 题面 题目背景 徐老师很胖,长宽高比例为1:1:1,他每次走路都要滚来滚去~~现在假设在一个平面上有 n 个没有公共点公共点的圆.徐老师要从点 ...