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. (转)使用ServiceStack构建Web服务

    提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...

  2. java考试

    package ATM;import java.util.Scanner; /**  * 操作学生数据  *   * @author Administrator  *  */  public clas ...

  3. gearman知识文章

    一篇文章: Gearman介绍.调研.测试与原理分析 gearman是什么? 它是分布式的程序调用框架,可完成跨语言的相互调用,适合在后台运行工作任务.最初是2005年perl版本,2008年发布C/ ...

  4. 常见Web源码泄露总结

    来自:http://www.hacksec.cn/Penetration-test/474.html 摘要 背景 本文主要是记录一下常见的源码泄漏问题,这些经常在web渗透测试以及CTF中出现. .h ...

  5. javascript;Jquery;获取JSON对象,无刷新评论实例。

      <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> < ...

  6. XML文件结构和基本语法

    XML文件的结构性内容,包括节点关系以及属性内容等等.元素是组成XML的最基本的单位,它由开始标记,属性和结束标记组成.就是一个元素的例子,每个元素必须有一个元素名,元素可以若干个属性以及属性值. x ...

  7. EGLImage与纹理

    http://blog.csdn.net/sunnytina/article/details/51895406 Android使用Direct Textures提高glReadPixels.glTex ...

  8. Python编程-函数进阶

    一.函数对象 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 4 可以当作容器类型的元素 def foo(): print('from foo') ...

  9. HAproxy 介绍

    HAproxy 介绍 (1)HAProxy 是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy ...

  10. 2020年将热门的8大IT职业领域

    近日,外媒梳理了未来5年内,也是就是2020年仍将受到热捧的八大科技领域,为IT从业者如何做好长远规划.有针对性地培养自身技能.又不偏离热门岗位提供了参考.(图片来自网易) 2020年将热门的8大IT ...