package com.nio.t;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption; /*
* 一、使用 NIO 完成网络通信的三个核心:
*
* 1. 通道(Channel):负责连接
*
* java.nio.channels.Channel 接口:
* |--SelectableChannel
* |--SocketChannel
* |--ServerSocketChannel //TCP
* |--DatagramChannel //UDP
*
* |--Pipe.SinkChannel
* |--Pipe.SourceChannel
*
* 2. 缓冲区(Buffer):负责数据的存取
*
* 3. 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况
*
*/
public class TestBlockingNIO { //客户端
public void client() throws IOException{
//1. 获取通道
SocketChannel sChannel = SocketChannel.open(
new InetSocketAddress("127.0.0.1", )); //此时文件全部都在FileChannel中
FileChannel inChannel = FileChannel.open(Paths.get("D:\\1.txt"),
StandardOpenOption.READ); //2. 分配指定大小的缓冲区
ByteBuffer buf = ByteBuffer.allocate(); //3. 读取本地文件,并发送到服务端
while(inChannel.read(buf) != -){ //FileChannel中的文件读入缓冲区
buf.flip();
sChannel.write(buf); //将缓冲区里的数据写入到SocketChannel中
buf.clear(); //清空缓冲区
}
//循环后,文件全部被送入了SocketChannel中
//4. 关闭通道
inChannel.close();
sChannel.close();
} //服务端
public void server() throws IOException{
//1. 获取通道,表示在本机开了一个ServerSocketChannel通道
ServerSocketChannel ssChannel = ServerSocketChannel.open(); //表示在本机创建一个空文件,等待写入数据
FileChannel outChannel = FileChannel.open(Paths.get("D:\\2.txt"),
StandardOpenOption.WRITE,
StandardOpenOption.CREATE);
//2. 绑定端口
ssChannel.bind(new InetSocketAddress()); //3. 获取客户端连接的通道,当与客户端建立好连接后,
SocketChannel sChannel = ssChannel.accept(); //4. 分配指定大小的缓冲区
ByteBuffer buf = ByteBuffer.allocate(); //5. 接收客户端的数据,并保存到本地
while(sChannel.read(buf) != -){
try {
Thread.sleep();
}catch (Exception e){ }
buf.flip();
outChannel.write(buf); //将缓冲区里的数据写入文件
buf.clear();
} //6. 关闭通道
sChannel.close();
outChannel.close();
ssChannel.close(); } public static void main(String[] args) {
new Thread(()->{
try {
new TestBlockingNIO().client();
System.out.println("client end....");
}catch (Exception e){ } }).start();
new Thread(()->{
try {
new TestBlockingNIO().server();
System.out.println("server end .....");
}catch (Exception e){ }
}).start();
} }

Java NIO阻塞式通信的更多相关文章

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

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

  2. 【Java】同步阻塞式(BIO)TCP通信

    TCP BIO 背景 网络编程的基本模型是Clien/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接 ...

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

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

  4. Java NIO通信的基础,基于TCP C/S例子介绍

    为了更好的理解Netty异步事件驱动网络通信框架,有必要先了解一点Java NIO原生的通信理论,下面将结合基于TCP的例子程序,含客户端和服务端的源码,实现了Echo流程. Java NIO的核心概 ...

  5. 【转载】Java NIO学习 & NIO BIO AIO 比较

    可以参考这个页面: http://www.iteye.com/magazines/132-Java-NIO (下面这个页面也有) http://ifeve.com/overview/ 另,在这篇文章里 ...

  6. Java-杂项-java.nio:java.nio

    ylbtech-Java-杂项-java.nio:java.nio java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有 ...

  7. JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信

    阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...

  8. Java NIO Socket 非阻塞通信

    相对于非阻塞通信的复杂性,通常客户端并不需要使用非阻塞通信以提高性能,故这里只有服务端使用非阻塞通信方式实现 客户端: package com.test.client; import java.io. ...

  9. Java IO(3)非阻塞式输入输出(NIO)

    在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...

随机推荐

  1. 000-mysql小技巧

    1.使用Navicat 链接5.7版本出现 mysql 5.7.9 [Err] 1055报错解决,[Err] 1055 – Expression #1 of ORDER BY clause is no ...

  2. 剑指offer 面试66题

    面试66题: 题目:构建乘积数组 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]* ...

  3. LCA(最近公共祖先)专题(不定期更新)

    Tarjan(离线)算法 思路: 1.任选一个点为根节点,从根节点开始. 2.遍历该点u所有子节点v,并标记这些子节点v已被访问过. 3.若是v还有子节点,返回2,否则下一步. 4.合并v到u上. 5 ...

  4. a各种状态

    hover   设置对象在其鼠标悬停时的样式表属性 active  设置对象在被用户激活(在鼠标点击与释放之间发生的事件)时的样式表属性.link  设置a对象在未被访问前的样式表属性.visited ...

  5. 反射,hashlib模块,正则匹配,冒泡,选择,插入排序

    一.反射(自省) 首先通过一个例子来看一下本文中可能用到的对象和相关概念. import sys # 模块,sys指向这个模块对象import inspectdef foo(): pass # 函数, ...

  6. 每天一个Linux命令(46)ifconfig命令

    在windows系统中,ipconfig命令行工具被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).     ( ...

  7. flex 实现图片播放 方案二 把临时3张图片预加载放入内存

    该方案,是预加载:前一张,当前,下一张图片,一共3张图片放入内存中.这样对内存的消耗可以非常小,加载之后的图片就释放内存. 下面示例一个是类ImagePlayers,一个是index.mxml pac ...

  8. Linux centos7 防火墙设置

    1.查看防火墙状态 systemctl list-unit-files|grep firewalld.service 或 systemctl status firewalld.service 2.开启 ...

  9. Python编程-面向对象和类

    一.面向对象的程序设计 1.面向过程 VS 面向对象 (1)编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程,一个程序是程序员为了得到一个任务结果而编写的一组 ...

  10. relativePath

    比如: com.tenace tenace 2.0.1 ../pom.xml //刚开始无此句 com.spider engine 2.6.0-SNAPSHOT tenace作为pom项目已经发布至r ...