文档章节

Netty进阶基础篇之NIO 阻塞通信(5)

木九天
 木九天
发布于 07/14 14:27
字数 454
阅读 14
收藏 0

NIO 完成网络通信的三个核心:Channel、Buffer、Selector

1、通道(Channel)

负责连接

SocketChannel、ServerSocketChannel、DatagramChannel、Pipe.SinkChannel、Pipe.SourceChannel

2、缓冲区(Buffer)

负责数据的存取

3、 选择器(Selector)

是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况

4、阻塞网络通信copy数据

//客户端
@Test
public void client() throws IOException{
   //1. 获取通道
   SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8085));
   
   FileChannel inChannel = FileChannel.open(Paths.get("/Users/tentsuuhou/Desktop/777.txt"), StandardOpenOption.READ);
   
   //2. 分配指定大小的缓冲区
   ByteBuffer buf = ByteBuffer.allocate(1024);
   
   //3. 读取本地文件,并发送到服务端
   while(inChannel.read(buf) != -1){
      buf.flip();
      sChannel.write(buf);
      buf.clear();
   }
   
   //4. 关闭通道
   inChannel.close();
   sChannel.close();
}

//服务端
@Test
public void server() throws IOException{
   //1. 获取通道
   ServerSocketChannel ssChannel = ServerSocketChannel.open();
   
   FileChannel outChannel = FileChannel.open(Paths.get("/Users/tentsuuhou/Desktop/666.txt"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
   
   //2. 绑定连接
   ssChannel.bind(new InetSocketAddress(8085));
   
   //3. 获取客户端连接的通道
   SocketChannel sChannel = ssChannel.accept();
   
   //4. 分配指定大小的缓冲区
   ByteBuffer buf = ByteBuffer.allocate(1024);
   
   //5. 接收客户端的数据,并保存到本地
   while(sChannel.read(buf) != -1){
      buf.flip();
      outChannel.write(buf);
      buf.clear();
   }
   
   //6. 关闭通道
   sChannel.close();
   outChannel.close();
   ssChannel.close();
}

先开启server端,在开启client端,这样就ok了

5、阻塞简单版client发送server数据

//客户端
@Test
public void client() throws IOException{
   SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8080));

   ByteBuffer buf = ByteBuffer.allocate(1024);

   sChannel.shutdownOutput();
   
   //接收服务端的反馈
   int len = 0;
   while((len = sChannel.read(buf)) != -1){
      buf.flip();
      System.out.println(new String(buf.array(), 0, len));
      buf.clear();
   }
   
   sChannel.close();
}

//服务端
@Test
public void server() throws IOException{
   ServerSocketChannel ssChannel = ServerSocketChannel.open();

   ssChannel.bind(new InetSocketAddress(8080));
   
   SocketChannel sChannel = ssChannel.accept();
   
   ByteBuffer buf = ByteBuffer.allocate(1024);

   
   //发送反馈给客户端
   buf.put("服务端接收数据成功".getBytes());
   buf.flip();
   sChannel.write(buf);
   
   sChannel.close();
   ssChannel.close();
}

client中,sChannel.shutdownOutput(); 如果没有这个,处于阻塞状态,server不知道,只有shutdownOutput()才能提醒server端,这样就能把client的数据传到server中。

© 著作权归作者所有

木九天

木九天

粉丝 204
博文 228
码字总数 177766
作品 0
海淀
程序员
私信 提问
少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别

本文引用了“架构师社区”公众号的《史上讲的最好的Java NIO与IO的区别与应用》一文部分内容,感谢原作者的技术分享。 1、引言 很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典...

JackJiang2011
06/25
0
0
Java分布式框架netty之NIO框架区别分析

Netty概述: 1、netty是基于Java NIO的网络应用框架,client-server框架 2、Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持, 作为一个异步NIO框架,Netty...

架构师springboot
2018/11/12
481
0
Netty高性能架构的理解之道

Netty的简单介绍 Netty 是一个 NIO client-server(客户端服务器)框架,使用 Netty 可以快速开发网络应用,例如服务器和客户 端协议。 Netty 提供了一种新的方式来使开发网络应用程序,这种新...

烂猪皮
2018/05/04
118
2
Qzone 微信 Java高级——dubbo源码分析之远程通信 netty

Java高级——dubbo源码分析之远程通信 netty dubbo 底层通信选择了 netty 这个 nio 框架做为默认的网络通信框架并且通过自定义协议进行通信。dubbo 支持以下网络通信框架: Netty(默认) Min...

Java架构师那些事
2018/08/29
0
0
如何使用Netty开发实现高性能的RPC服务器

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议。说的再直白一点,就是客户端在不必知道调用细节的...

vshcxl
2017/10/20
229
0

没有更多内容

加载失败,请刷新页面

加载更多

Flink Graph生成及Hash生成分析

222

MrPei
23分钟前
1
0
[译]Android Activity 和 Fragment 状态保存与恢复的最佳实践

https://blog.csdn.net/growing_tree/article/details/53759564 https://blog.csdn.net/u013588712/article/details/54691791...

shzwork
24分钟前
1
0
调用第三方快递鸟物流单号查询接口API代码示例

最近进行网站后台开发,需要实现物流的即时查询,发现之前集成的 快递100物流查询 API ——【PHP 快递查询源码资源】 已经不能正常使用了; 为了方便以后的业务需求,经过比较,最后选择使用...

程序的小猿
31分钟前
3
0
java Poi 操作执行excel 文件中函数问题

poi 读取excel 文件,当excel 有函数时,poi直接读取返回的是excel 函数,并不能返回函数计算结果: 解决步骤: sheet.setForceFormulaRecalculation(true); 判断该列格式是否为...

早a
39分钟前
4
0
js模拟实现输入框input事件

直接修改value值是无法触发对应元素的事件的。 通过发送输入框input事件了, 可以触发。 这里简单封装了一个方法. window.inputValue = function (dom, st) { var evt = new InputEvent('i...

開援带碼
40分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部