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 环境下的安装,配置,以及总结了非常详细的 ...
随机推荐
- ubuntu16.04编译LAPACK3.7.1出错
NEP: Testing Nonsymmetric Eigenvalue Problem routines ./EIG/xeigtstz < nep.in > znep.out 2> ...
- 如何在eclipse里的动态Web项目建立后缀为xml的文件
1.右击Dynamic Web Project类型项目的WEB-INF->new->Other->XML,选择XML File2 点击next改名字为web(后缀不要动哦)3. 点击 ...
- css可继承与不可继承的属性
一.可继承性的属性 字体相关的:font-size/font-family/font-weight/font-style/font-variant/font-stretch 文本相关的:color/t ...
- XenForo论坛安装
1.下载安装程序,程序可以到qq群里面找,或者是联系我 2.域名+/install安装 3.汉化后台,访问https://www.cnxfans.com/resources/xenforo-2-x.1 ...
- 调度器46—tick模式
一.tick简介 tick就是一个周期性的中断,周期通过 CONFIG_HZ 进行配置,一般常取值为100Hz.250Hz.1000Hz.Tick 每秒窃取CPU 100 到 1000 次,导致Ica ...
- springcloud(二) - 服务调用Feign&openFeign
功能介绍:动态代理的方式,简化请求其他服务的开发成本,更好得对请求地址组装.接受返回信息.返回参数解析等 Feign和OpenFeign区别: OpenFeign实现了Feign的基础功能,同时支持 ...
- Eclipse设置背景色等
1.设置背景色 a.Window->Preferences->General->Editors->Text Editors b.选择Background color选择自定义颜 ...
- java写 变量到文件
import java.io.BufferedReader; import java.io.File;import java.io.FileReader; import java.io.IOExcep ...
- 2022 icpc 沈阳站 记录(非题解)
赛前 大概是赛前三周才突然知道拥有了比赛机会. 赛前训练和vp频率很高,有一段时间cf上都是绿的.比赛的那一周只有一天没在vp,到了周六热身赛我人都有点麻木.(可能正赛也是类似的状态吧) 比赛的过程b ...
- MinGW、Linux GNU、MSVC编译和链接动态库的分析
这几天研究CMake跨平台项目嘛,用了以下几种编译器: VS2019(MSVC) Linux GNU MinGW 编译之后发现链接动态库发现以下问题: VS2019中如果直接链接CMakeLists. ...