一、编写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. windows server 2012以上版本离线安装 net framework3.5 方法

    方法1. 通过服务管理器安装操作系统原镜像文件 准备windows系统镜像文件,解压windows server.iso文件到 D:\WindowsOS 在服务器管理器上添加.NET Framewor ...

  2. redis 缓存穿透和缓存击穿,缓存雪崩的原因及解决方案

    缓存穿透 缓存穿透是指查询缓存中没有,数据库中也没有的数据 .从系统层面来看,请求像是穿透了缓存,直接访问数据库.这种情况会给系统带来潜在的风险,如果有大量的请求访问系统数据库中不存在的数据,会直接请 ...

  3. WPF-窗体移动,最小化,最大化,关闭

    1,按钮操作 public MainView() { InitializeComponent(); this.MaxHeight = SystemParameters.PrimaryScreenHei ...

  4. (0724) 格雷码 verilog

    https://blog.csdn.net/gordon_77/article/details/79489548 assign gray_value = (binary_value >> ...

  5. 报错解决OSError: /lib64/libm.so.6: version `GLIBC_2.27' not found

    使用pyg报错如下: 1 Traceback (most recent call last): 2 File "main.py", line 18, in <module&g ...

  6. 【服务器数据恢复】热备盘同步失败导致数据丢失的raid5数据恢复案例

    服务器数据恢复环境:华为s系列服务器:24块硬盘组成一组raid5磁盘阵列,其中包含1块热备盘. 服务器故障&检测:服务器工作状态下raid5中有一块硬盘离线,热备盘激活替换离线硬盘并开始进行 ...

  7. 基于Sobel算子的图像边缘检测

    索贝尔算子(Sobeloperator)主要用于获得数字图像的一阶梯度,是一种离散性差分算子.它是prewitt算子的改进形式,改进之处在于sobel算子认为,邻域的像素对当前像素产生的影响不是等价的 ...

  8. 浅谈Redis大Key与热Key

    如何定义大 Key 和 热 Key 如何定义大 Key 如何定义热 Key 大 Key 和 热 Key 产生的原因 大 Key 和 热 Key 有哪些危害 大 Key 的危害 热 Key 的危害 如何 ...

  9. 【NPDP专项练习】第七章 产品生命周期管理

    第七章 产品生命周期管理 1.以下哪一项是产品生命周期缩短的原因之一? A 技术停滞不前 B 减少竞争 C 顾客要求更高 D 沟通障碍正在增加 答案:C 解析 A技术持续进步:B竞争加剧:D沟通增加 ...

  10. 博客神器Gridea

    博客神器Gridea Gridea 温故而知新 Gridea 最早叫 Hve Notes ,开发者为了更易读和好记,重新命名为 Gridea,支持 Windows 和 Mac 平台,他的基础界面非常的 ...