Netty进阶基础篇之NIO 阻塞通信(5)-程序员宅基地

技术标签: netty  

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

742584ddf3c0e5a324f4c2eb78fa7cf52a7.jpg

转载于:https://my.oschina.net/mdxlcj/blog/3073927

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chuxie2576/article/details/100684239

智能推荐

7-9 Jack cheng的烦恼2_轻舟不载愁的博客-程序员宅基地

Jackcheng刚入初中时成绩是相当棒的,尤其令老师们感到惊奇的这孩子会编程。殊不知随着堕入游戏的魔道之中,Jackcheng仅有的编程知识不仅毫无长进,而且大大退化了。 这天他的数学老师突然了有了一个吃惊的想法,想通过促进学生们进行一些编程知识的学习,锻炼他们的逻辑能力,让学生们更好的学习math 。 因此他想起了Jackcheng 。 Jackcheng真的慌了 , 他不得不又向你求救了。...

mysql dba工作不好找_你知道DBA工程师到底需要做什么工作吗?_weixin_39988779的博客-程序员宅基地

详情:这个我整理的OracleDBA所需要担负的职责以及日常工作中需要做到的一些工作,你们可以很清楚的知道做一个合格的DBA需要哪些知识和技能DBA职责及日常工作职责:1.安装和升级数据库服务器,以及应用程序工具构建和配置网络环境.2.熟悉数据库系统的存储结构预测未来的存储需求,制订数据库的存储方案.3.根据开发人员设计的应用系统需求创建数据库存储结构.4.根据开发人员设计的应用系统需求创建数...

Android Studio运行工程报错:java.exe'' finished with non-zero exit value 1_wyyl1的博客-程序员宅基地

转自:http://blog.csdn.net/serapme/article/details/46685557报错信息例如:java.exe'' finished with non-zero exit value 1java.exe'' finished with non-zero exit value 2java.exe'' finished with non-ze

Jenkins安装Performance Plugin插件-程序员宅基地

1、下载:git clone https://github.com/jenkinsci/performance-plugin.git performance2、maven运行performance3、pom.xml中添加<plugin> <groupId>org.apache.maven.plugins</groupId> <..._performance plugin

Spark SQL与Hive on Spark的比较_spark on hive框架图-程序员宅基地

简要介绍了SparkSQL与HiveonSpark的区别与联系一、关于Spark简介在Hadoop的整个生态系统中,Spark和MapReduce在同一个层级,即主要解决分布式计算框架的问题。架构Spark的架构如下图所示,主要包含四大组件:Driver、Master、Worker和Executor。Spark特点Spark可以部署在YARN上 Spark原生支持对HDFS文件系统的访问 使用Scala语言编写部署模型单机模型:主要用来开发测试。特点:Drive.._spark on hive框架图

nginx负载均衡配置_宝塔修改upstream tong_server_sin wan的博客-程序员宅基地

1.实现效果(1)浏览器地址栏输入http://192.168.116.11/tonglaoban/test.html,观察负载均衡的实现效果,请求按照2:1分担到两个节点192.168.202.131和192.168.202.132的8080端口。2、准备工作(1)准备两台tomcat服务器。(2)在两台tomcat里面webapps目录中,创建名称是tonglaoban的文件夹,在该文件夹中创建test.html页面,为了测试效果明显,建议填写所在服务器的IP地址。该配..._宝塔修改upstream tong_server

随便推点

php桶排序,PHP算法之桶排序_平心冷静的博客-程序员宅基地

摘要:桶排序可以说得上是最简单的排序算法了,但是它的使用范围非常狭窄,不过不可否认的是在其适用范围内,它的性能要比快速排序还要快上很多倍。桶排序可以说得上是最简单的排序算法了,但是它的使用范围非常狭窄,不过不可否认的是在其适用范围内,它的性能要比快速排序还要快上很多倍。没错,桶排序也是一种非比较型排序算法,这也正是它能够超越快速排序的原因。桶排序主要有以下缺陷:参与排序的数组存放的必须是整数。数组..._php 桶排序

安卓开发——报错:You must specifiy a layout in the include tag: <include layout="@layout/layoutID" />_萌鼠喝酸奶的博客-程序员宅基地

日常报错:Caused by: android.view.InflateException: You must specifiy a layout in the include tag: 原因是:include导入layout时,layout属性前面不应该加android

OpenCV-PyQT项目实战(10)项目案例06:键盘事件与视频抓拍_pyqt5 键盘事件-程序员宅基地

本节继续介绍使用键盘事件从播放的视频中抓拍图像。本例使用 OpenCV视频解码,用PyQt播放视频,用键盘事件抓拍视频中的图像。本文提供完整例程:PyQt 中的事件处理例程,按键事件与捕获按键值例程,视频播放与图像捕获例程。_pyqt5 键盘事件

Hadoop---(4)HBase(分布式存储系统)_hadoop分布式数据存储hbase_Mr Cao的博客-程序员宅基地

HBASEHBase(Hadoop Database),是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中海量数据。利用Zookeeper作为协调工具。 HMaster— HBase..._hadoop分布式数据存储hbase

c 语言 1156 单数变复数_c语言单数变复数-程序员宅基地

/*****题目描述输入一个名词英语单词,按照英语语法规则把单数变成复数。规则如下:(1) 以辅音字母y结尾,变y为i,再加es;(2) 以s, x, ch, sh结尾,则加es;(3) 以元音o结尾,则加es;(4) 其他情况加上s。输入输入一个字符串,仅含小写字母,长度不超过20。输出输出其对应的复数形式。样例输入 Copybutterfly样例输出 Copybut..._c语言单数变复数

2.1_9 Oralce 收集统计信息方式1_SYS.DBMS_STATS_收集统计信息 sys用户-程序员宅基地

Oracle收集统计信息方式1 SYS.DBMS_STATS_收集统计信息 sys用户

推荐文章

热门文章

相关标签