文档章节

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中。

© 著作权归作者所有

木九天

木九天

粉丝 183
博文 224
码字总数 171159
作品 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
223
0

没有更多内容

加载失败,请刷新页面

加载更多

反射

类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化来实现对这个类进行初始化 加载: 将class文件读入内存, 并为之创建一个Class对象; 任何类...

凹凸凸
48分钟前
4
0
jQuery与Ajax的应用

jQuery与Ajax的应用 Ajax Ajax 即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术,异步交互,传输的数据为XML.是一种在无需重新加载...

cjy_lean
59分钟前
6
0
查漏补缺,JVM系列:(JVM内存组成及分配)

java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”...

小刀爱编程
今天
5
0
Java实现哈希表

Java实现哈希表 基本概念 哈希表:Hash Table,也称为散列表。在待存放的数据中定义一个关键字k,通过一个映射关系f,将k映射到一个地址中,这个地址称为散列地址。之后查找该记录时,不用再...

盒饭加鸡腿
今天
5
0
透彻讲解:并发编程的优缺点

一直以来并发编程对于刚入行的小白来说总是觉得高深莫测,于是乎,就诞生了想写点东西记录下,以提升理解和堆并发编程的认知。为什么需要用的并发?凡事总有好坏两面,之间的trade-off是什么...

李红欧巴
今天
32
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部