1. import java.io.IOException;
  2. import java.net.InetSocketAddress;
  3. import java.nio.ByteBuffer;
  4. import java.nio.channels.FileChannel;
  5. import java.nio.channels.ServerSocketChannel;
  6. import java.nio.channels.SocketChannel;
  7. import java.nio.file.Paths;
  8. import java.nio.file.StandardOpenOption;
  9.  
  10. import org.junit.Test;
  11.  
  12. /*
  13. * 一、使用 NIO 完成网络通信的三个核心:
  14. *
  15. * 1. 通道(Channel):负责连接
  16. *
  17. * java.nio.channels.Channel 接口:
  18. * |--SelectableChannel
  19. * |--SocketChannel
  20. * |--ServerSocketChannel
  21. * |--DatagramChannel
  22. *
  23. * |--Pipe.SinkChannel
  24. * |--Pipe.SourceChannel
  25. *
  26. * 2. 缓冲区(Buffer):负责数据的存取
  27. *
  28. * 3. 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况
  29. *
  30. */
  31. public class TestBlockingNIO {
  32.  
  33. //客户端
  34. @Test
  35. public void client() throws IOException{
  36. //1. 获取通道
  37. SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));
  38.  
  39. FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
  40.  
  41. //2. 分配指定大小的缓冲区
  42. ByteBuffer buf = ByteBuffer.allocate(1024);
  43.  
  44. //3. 读取本地文件,并发送到服务端
  45. while(inChannel.read(buf) != -1){
  46. buf.flip();
  47. sChannel.write(buf);
  48. buf.clear();
  49. }
  50.  
  51. //4. 关闭通道
  52. inChannel.close();
  53. sChannel.close();
  54. }
  55.  
  56. //服务端
  57. @Test
  58. public void server() throws IOException{
  59. //1. 获取通道
  60. ServerSocketChannel ssChannel = ServerSocketChannel.open();
  61.  
  62. FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
  63.  
  64. //2. 绑定连接
  65. ssChannel.bind(new InetSocketAddress(9898));
  66.  
  67. //3. 获取客户端连接的通道
  68. SocketChannel sChannel = ssChannel.accept();
  69.  
  70. //4. 分配指定大小的缓冲区
  71. ByteBuffer buf = ByteBuffer.allocate(1024);
  72.  
  73. //5. 接收客户端的数据,并保存到本地
  74. while(sChannel.read(buf) != -1){
  75. buf.flip();
  76. outChannel.write(buf);
  77. buf.clear();
  78. }
  79.  
  80. //6. 关闭通道
  81. sChannel.close();
  82. outChannel.close();
  83. ssChannel.close();
  84.  
  85. }
  86.  
  87. }

客户端服务端的响应交互

  1. import java.io.IOException;
  2. import java.net.InetSocketAddress;
  3. import java.nio.ByteBuffer;
  4. import java.nio.channels.FileChannel;
  5. import java.nio.channels.ServerSocketChannel;
  6. import java.nio.channels.SocketChannel;
  7. import java.nio.file.Paths;
  8. import java.nio.file.StandardOpenOption;
  9.  
  10. import org.junit.Test;
  11.  
  12. public class TestBlockingNIO2 {
  13.  
  14. //客户端
  15. @Test
  16. public void client() throws IOException{
  17. SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));
  18.  
  19. FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
  20.  
  21. ByteBuffer buf = ByteBuffer.allocate(1024);
  22.  
  23. while(inChannel.read(buf) != -1){
  24. buf.flip();
  25. sChannel.write(buf);
  26. buf.clear();
  27. }
  28.  
  29. sChannel.shutdownOutput();
  30.  
  31. //接收服务端的反馈
  32. int len = 0;
  33. while((len = sChannel.read(buf)) != -1){
  34. buf.flip();
  35. System.out.println(new String(buf.array(), 0, len));
  36. buf.clear();
  37. }
  38.  
  39. inChannel.close();
  40. sChannel.close();
  41. }
  42.  
  43. //服务端
  44. @Test
  45. public void server() throws IOException{
  46. ServerSocketChannel ssChannel = ServerSocketChannel.open();
  47.  
  48. FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
  49.  
  50. ssChannel.bind(new InetSocketAddress(9898));
  51.  
  52. SocketChannel sChannel = ssChannel.accept();
  53.  
  54. ByteBuffer buf = ByteBuffer.allocate(1024);
  55.  
  56. while(sChannel.read(buf) != -1){
  57. buf.flip();
  58. outChannel.write(buf);
  59. buf.clear();
  60. }
  61.  
  62. //发送反馈给客户端
  63. buf.put("服务端接收数据成功".getBytes());
  64. buf.flip();
  65. sChannel.write(buf);
  66.  
  67. sChannel.close();
  68. outChannel.close();
  69. ssChannel.close();
  70. }
  71.  
  72. }

NIO-3网络通信的更多相关文章

  1. NIO完成网络通信(一)

    NIO:即非阻塞式IO 视频教程:  https://chuanke.baidu.com/v1982732-211322-1316084.html 使用步骤: 1.创建 ServerSocketCha ...

  2. JAVA NIO学习三:NIO 的非阻塞式网络通信

    紧接着上一章,我们继续来研究NIO,上一章中我们讲了NIO 中最常见的操作即文件通道的操作,但实际上NIO的主要用途还是在于网络通信,那么这个时候就会涉及到选择器,这一章我们就会对其进行讲解操作. 一 ...

  3. JAVA NIO学习记录2-非阻塞式网络通信

    一.阻塞与非阻塞 传统的IO 流都是阻塞式的.也就是说,当一个线程调用read() 或write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信 ...

  4. 4.NIO的非阻塞式网络通信

    /*阻塞 和 非阻塞 是对于 网络通信而言的*/ /*原先IO通信在进行一些读写操作 或者 等待 客户机连接 这种,是阻塞的,必须要等到有数据被处理,当前线程才被释放*/ /*NIO 通信 是将这个阻 ...

  5. NIO 的非阻塞式网络通信

    1.阻塞与非阻塞   ①  传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write()时, 该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务. 因 ...

  6. JDK10都发布了,nio你了解多少?

    前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多). 但是,发现在整理 ...

  7. NIO的初步入门

    NIO java NIO简介 Java NIO 简介 是从java1.4版本开始引入的一个新的IO AP可以替代标准java  IO API NIO与原来的IO有同样的作用和目的,但是使用方式完全不同 ...

  8. Java之NIO

    想要学习Java的Socket通信,首先要学习Java的IO和NIO基础,这方面可以阅读<Java NIO 系列教程>. 下面展示自己代码熟悉Java的NIO编程的笔记. 1.缓冲区(Bu ...

  9. Java NIO -- 阻塞和非阻塞

    传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信进行 IO操作 ...

  10. Java中的NIO及IO

    1.概述 Java NIO(New IO) 是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同, ...

随机推荐

  1. forEach、for+i、map的用法及区别

      array.forEach(callback[, thisObject]); 下面是参数的详细信息: 1. callback : 函数测试数组的每个元素. 2.thisObject : 对象作为该 ...

  2. tomcat8在centos7.5下配置开机启动

    本文参考这篇文章 一.在/etc/init.d下新建一个文件tomcat,并添加内容如下: #!/bin/sh # chkconfig: 345 99 10 # description: Auto-s ...

  3. HDU 1431 思维 基础数论

    找范围内回文素数,最大到1e8,我就是要枚举回文串,再判素数,然后因为这种弱智思路死磕了很久题目. /** @Date : 2017-09-08 15:24:43 * @FileName: HDU 1 ...

  4. Bargaining Table

    Bargaining Table time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  5. <LC刷题二>回文字符串判断之leetcode125&234

    其他刷题记录见博客首页 1,leecode125 验证回文串 原题: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. ...

  6. JAVA多线程提高八:线程锁技术

    前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...

  7. Javascript判断Chrome浏览器

    今天分享一下如何通过Javascript来判断Chrome浏览器,这里是通过userAgent判断的,检测一下userAgent返回的字符串里面是否包含“Chrome”, 具体怎么检测是通过index ...

  8. 聊聊spring的那些扩展机制

    1.背景 慎入:本文将会有大量代码出入. 在看一些框架源码的时候,可以看见他们很多都会和Spring去做结合.举个例子dubbo的配置: 很多人其实配置了也就配置了,没有去过多的思考:为什么这么配置s ...

  9. 【leetcode 简单】 第五十三题 删除重复的电子邮箱

    编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个. +----+------------------+ | Id | Email | +-- ...

  10. bzoj 2741 可持久化trie

    首先我们设si为前i个数的xor和,那么对于询问区间[i,j]的xor和,就相当于si-1^sj,那么对于这道题的询问我们可以处理处si,然后对于询问[l,r],可以表示为在区间[l-1,r]里找两个 ...