一、编写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基本编写的更多相关文章

  1. netty简单NIO模型

    首先是使用java原生nio类库编写的例子,开发一套nio框架不简单,所以选择了netty,该例完成后,是netty举例. package com.smkj.netty; public class T ...

  2. 模拟实现 Tomcat 的核心模块:NIO,HTTP,容器和集群

    如果你想看 Tomcat 源码但又无从入手,不妨从这个项目开始,代码量不多,但包含了 Tomcat 的核心处理流程,并且源码中有相当丰富的注释.相信通过此项目你能了解: NIO 基本编程.HTTP 协 ...

  3. JAVA BIO,NIO,Reactor模式总结

    传统同步阻塞I/O(BIO) 在NIO之前编写服务器使用的是同步阻塞I/O(Blocking I/O).下面是一个典型的线程池客服端服务器示例代码,这段代码在连接数急剧上升的情况下,这个服务器代码就会 ...

  4. java基于P2P的聊天和文件传输实例

    用java的NIO技术编写的 1. 支持聊天功能 2. 拖拽文件能够实现文件传输功能.也能够是目录 3. 启动时能够选择server端或client端启动 4. 本人原创.学习NIO和java的网络通 ...

  5. [Netty] - Netty IN ACTION(导言)

    最近没什么事儿做,刚好看到有需要网络编程的知识,java中有NIO和IO两种不同的方式,但是NIO的编写比较麻烦,刚好找到一个成熟的网络框架Netty.接下来的一个月就准备将Netty IN ACTI ...

  6. [Netty] - Netty入门(最简单的Netty客户端/服务器程序)

    Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...

  7. 【Netty】Netty简介及服务器客户端简单开发流程

    什么是Netty Netty是一个基于Java NIO的编写客服端服务器的框架,是一个异步事件框架. 官网https://netty.io/ 为什么选择Netty 由于JAVA NIO编写服务器的过程 ...

  8. [转]Netty入门(最简单的Netty客户端/服务器程序)

    Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...

  9. 解Bug之路-dubbo流量上线时的非平滑问题

    前言 笔者最近解决了一个困扰了业务系统很久的问题.这个问题只在发布时出现,每次只影响一两次调用,相较于其它的问题来说,这个问题有点不够受重视.由于种种原因,使得这个问题到了业务必须解决的程度,于是就到 ...

  10. 【1w字+干货】第一篇,基础:让你的 Redis 不再只是安装吃灰到卸载(Linux环境)

    Redis 基础以及进阶的两篇已经全部更新好了,为了字数限制以及阅读方便,分成两篇发布. 本篇主要内容为:NoSQL 引入 Redis ,以及在 Linux7 环境下的安装,配置,以及总结了非常详细的 ...

随机推荐

  1. linux下安装jdk8,nginx

    jdk8(官网下载的是jdk-8u231-linux-x64.tar.gz) 1.在/usr/local这路径下建一个jdk的文件夹,将下载好的jdk-8u231-linux-x64.tar.gz上传 ...

  2. react hooks组件父组件调用子组件方法

    函数组件父组件调用子组件方法需要使用 useImperativeHandle 和 forwardRef 两个方法 1.子组件 2.父组件 注意:一定要使用ref来接从子组件传过来的实例值,用其他的在函 ...

  3. 读后笔记 -- Python 全栈测试开发 Chapter8:接口测试

    8.1 接口测试 1. 市场分布 UI(web.app)自动化:10% 接口自动化:20% 单元测试:70% -- 测开 2. 接口类型: 1)结构划分:模块间(系统间)的接口称为内部接口:系统与第三 ...

  4. Linux CentOS下搭建golang 1.17 开发环境

    1. 下载软件包并安装 cd ~ wget https://storage.googleapis.com/golang/go1.17.2.linux-amd64.tar.gz tar zxvf go1 ...

  5. scrapy框架学习(五)定义数据结构和多页爬取

    定义数据结构和多页爬取 定义数据结构 在items.py文件中定义你要提取的内容(定义数据结构),比如我提取的内容为用户名name.用户头像链接face_src.好笑数funny.评论数comment ...

  6. flink 版本

    从1.10.0开始,flink版本是一个分界线,所以如果用>1.10版本的特性,一些flink引用可以从1.10官网文档中查 后面版本中没有这些说明了. flink代码文档地址:https:// ...

  7. GPIO原理及配制方法

    GPIO原理及配制方法 引用地址: ARM SOC芯片的GPIO结构示意图 @@@ GPIO的八种模式 1,输入浮空模式 2,输入上拉模式 3,输入下拉模式 4,模拟输入模式 5,开漏输出模式 6,开 ...

  8. ERA5气压层数据驱动WRF的一些问题

    感谢Dawn的建议,兰溪之水的WRF教程 参考了一些经验,并结合实际后,成功用ERA5驱动WRF.实际上,用ERA5数据驱动WRF的方法和用ERA-Interim 数据驱动WRF极其类似. 总结几点是 ...

  9. 【Anaconda】Jupyter 中添加 Anaconda 环境

    两种方法: 1. 安装 nb_conda_kernels,将所有 conda 环境同步至 Jupyter Notebook,参考『Jupyter notebook选择conda环境 - 简书』. 2. ...

  10. 微信退款报错 400 the ssl certificatie error / no required SSL certificate was sent ; Guzzle json_encode Type is not supported;

    bug随笔 一 起因. 在做一个点餐类小程序,本地测试ok.上测试的时候,突然就报错,微信退款失败. 二 Debug. 1. Debug trace到页面直接显示的是 : Type is not su ...