Java NIO阻塞式通信
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阻塞式通信的更多相关文章
- Java NIO -- 阻塞和非阻塞
传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write()时,该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务.因此,在完成网络通信进行 IO操作 ...
- 【Java】同步阻塞式(BIO)TCP通信
TCP BIO 背景 网络编程的基本模型是Clien/Server模型,也就是两个进程之间进行相互通信,其中服务端提供位置信息(绑定的IP地址和监听端口),客户端通过连接操作向服务端监听的地址发起连接 ...
- 4.NIO的非阻塞式网络通信
/*阻塞 和 非阻塞 是对于 网络通信而言的*/ /*原先IO通信在进行一些读写操作 或者 等待 客户机连接 这种,是阻塞的,必须要等到有数据被处理,当前线程才被释放*/ /*NIO 通信 是将这个阻 ...
- Java NIO通信的基础,基于TCP C/S例子介绍
为了更好的理解Netty异步事件驱动网络通信框架,有必要先了解一点Java NIO原生的通信理论,下面将结合基于TCP的例子程序,含客户端和服务端的源码,实现了Echo流程. Java NIO的核心概 ...
- 【转载】Java NIO学习 & NIO BIO AIO 比较
可以参考这个页面: http://www.iteye.com/magazines/132-Java-NIO (下面这个页面也有) http://ifeve.com/overview/ 另,在这篇文章里 ...
- Java-杂项-java.nio:java.nio
ylbtech-Java-杂项-java.nio:java.nio java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有 ...
- JAVA基础知识之网络编程——-基于NIO的非阻塞Socket通信
阻塞IO与非阻塞IO 通常情况下的Socket都是阻塞式的, 程序的输入输出都会让当前线程进入阻塞状态, 因此服务器需要为每一个客户端都创建一个线程. 从JAVA1.4开始引入了NIO API, NI ...
- Java NIO Socket 非阻塞通信
相对于非阻塞通信的复杂性,通常客户端并不需要使用非阻塞通信以提高性能,故这里只有服务端使用非阻塞通信方式实现 客户端: package com.test.client; import java.io. ...
- Java IO(3)非阻塞式输入输出(NIO)
在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...
随机推荐
- 20170411 F110初始界面-建议清单
功能块代码 F110 开发类 FIBP 事务说明 自动付款参数 程序 SAPF ...
- Summaries On Java
@1:== 和 equals(): ==用于比较引用和比较基本数据类型时具有不同的功能: 比较基本数据类型:如果两个值相同,则结果为true. 比较引用:如果引用指向内存中的同一对象,结果为true( ...
- 前端之JQuery [续]
JQuery使用技巧 1.prop属性实现全选,反选,取消功能 需求: 实现全选,反选,取消功能 代码如下: <!DOCTYPE html> <html lang="en& ...
- iOS9 Search API 之 Spotlight
iOS9以后 有三种api提供搜搜方式 加强引导用户关注 我们的app及相关内容的方式 NSUserActivity Web Markup Core Spotlight 用法 前两种 实战操作性不够 ...
- javascript;select动态添加和删除option
<select id="sltCity"></select> //添加Option. var optionObj = new Option(text, va ...
- Linux脚本程序包及安装
概述 脚本程序并不多见,所以在软件包分类中并没有把它列为一类.它更加类似于 Windows 下的程序安装,有一个可执行的安装程序,只要运行安装程序,然后进行简单的功能定制选择(比如指定安装目录等),就 ...
- 大数据架构之:Storm
Storm是一个免费开源.分布式.高容错的实时计算系统,Twitter开发贡献给社区的.Storm令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求. Storm经常用 ...
- 20145230《java学习笔记》第十周学习总结
20145230<Java程序设计>第十周学习总结 教材学习内容总结 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或 ...
- mini2440移植uboot 2014.04(七)
上一篇博文:<mini2440移植uboot 2014.04(六)> 代码已经上传到github上: https://github.com/qiaoyuguo/u-boot-2014.04 ...
- flume 使用遇到问题及解决
1. ../flume/fchannel/spool/data/ 目录下发生缓存文件积压 可能原因:同一时间同一客户端下向两个监控目录mv文件:或同一时间多个客户端向服务端上传文件 2.清空../fl ...