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. nodejs开发的example或学习文档

    nodejs开发一般使用webstorm作为ide. 还有个叫Cloud 9的云编辑器. webstorm注册网址: http://idea.lanyus.com/ http://amirrajan. ...

  2. 软件工作考核项(zcl)——

    注意:这里没有对代码风格做要求,因为要代码走查! 考核项 考核标准 分数等级   需求规格说明书编写 主要用例图缺失 -1   主要软件界面设计图缺失 -1   主要功能清单项目缺失 -1   主要复 ...

  3. PAT 天梯赛 L1-006. 连续因子 【循环】

    题目链接 https://www.patest.cn/contests/gplt/L1-006 思路 输出的连续因子 的乘积 也要是这个数的因子 就每个数先找它的单因子 然后每个单因子往上一个一个遍历 ...

  4. 8.22 ps课堂练习

    真是做得超烂!以前学的快忘光了!

  5. java的服务端与客户端通信(2)

    一.Socket连接与HTTP连接   1.1Socket套接字 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信 ...

  6. Mysql主从复制原理详解

    一.为什么要做主从同步 1.读写分离,降低对主数据库的IO消耗 2.避免数据丢失 3.提高业务系统性能 二.主从同步和集群的区别 1.主从同步 一般需要两台及以上数据库服务器即可(一台用于写入数据,一 ...

  7. display:inline-block 间隙

    IE6/7是不支持display:inline-block属性,只是让其表现的跟inline-block一样,尤其对于inline水平的元素,其表现度可以用perfect一词来形容了. 对于IE8+以 ...

  8. android studio Error:Unable to start the daemon process【转】

    本文转载自:https://blog.csdn.net/dhx20022889/article/details/44919905 我在用android studio 做一个小项目,在家里的mac电脑中 ...

  9. 【bzoj1899】[Zjoi2004]Lunch 午餐(贪心+dp)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1899 显然为了节省时间,吃饭慢的人要先打饭.于是我们可以先把所有人按吃饭时间排序,于是 ...

  10. Spring中AOP的初窥和入门小案例

    AOP:面向切面编程 AOP的主要作用:是为了程序员更好的关注"业务",专心"做事" 加上双引号的意思:所谓业务,是指他的核心,各行业中需要处理的核心事务,核心 ...