一、编写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. Markdowm的下载方法

    1打开百度搜索,输入TYPORA打开下载页面,根据自己的系统(我的是WINDOWS64位)点"DOWN"进行下载安装. 2安装好后回到桌面新建一个文件夹(Markdown学习),然 ...

  2. Tomcat集群配置--负载均衡

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  3. docker+gunicorn+fastapi部署

    一.准备工作 1.先确保项目可以正常运行 2.使用pip freeze导出第三方库 3.在项目根目录新建pip.conf文件,写入一下内容 [global] index-url=http://pypi ...

  4. 51电子-STC89C51开发板:汇编教程

    全部内容请点击目录列表查看: 51电子-STC89C51开发板:<目录> ---------------------------  正文开始  ---------------------- ...

  5. 专业视频图片水印清除工具丨HitPaw Watermark Remover 2.1.3

    软件下载 MAC/Windows HitPaw Watermark Remover 软件介绍 HitPaw Watermark Remover 是一款能够轻松去除图片视频水印的软件.对于有水印的图片视 ...

  6. JAVA学习笔记-06

    多态:可以理解为事物存在的多种体现形态 1.多态的基本体现 父类的引用指向了自己的子类对象 父类的引用也可以接收自己的子类对象 2.多态的前提 必须是类与类之间有关系,要么继承,要么实现 通常还有一个 ...

  7. 关系型数据库,基表Guid 主键设值

    在我们开发过程,为了自动适应新增修改,可以对基表,Guid 类型进行如下设置: public bool IsTransient() {       return this.Id == Guid.Emp ...

  8. vue项目,npm run dev的时候出现:Error: error:0308010C:digital envelope routines::unsupported

    vue项目,npm run dev的时候出现:Error: error:0308010C:digital envelope routines::unsupported 这个是node的版本问题.我的n ...

  9. unity默认管线lightmap

    lightmap采样 https://blog.csdn.net/wodownload2/article/details/94431040

  10. 两个DIV的切换

    <html><head><title>HTML元素的显示与隐藏控制</title><script type="text/javascri ...