5. Java NIO系列之阻塞式IO
来源:互联网 发布:format java 编辑:程序博客网 时间:2024/06/02 05:07
使用 NIO 完成网络通信的三个核心:
1. 通道(channel):负责连接
java.nio.channels.Channel 接口:
|--SelectableChannel
|--SocketChannel
|--ServerSocketChannel
|--DatagramChannel
|--Pipe.SinkChannel
|--Pipe.SourceChannel
2. 缓冲区(Buffer):负责数据的存取
3. 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况
例子一:客户端向服务器发送数据,将数据保存。
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;import org.junit.Test;public class TestBlockingNIO {//客户端@Testpublic void client() throws IOException{//1. 获取通道SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);//2. 分配指定大小的缓冲区ByteBuffer buf = ByteBuffer.allocate(1024);//3. 读取本地文件,并发送到服务端while(inChannel.read(buf) != -1){buf.flip();sChannel.write(buf);buf.clear();}//4. 关闭通道inChannel.close();sChannel.close();}//服务端@Testpublic void server() throws IOException{//1. 获取通道ServerSocketChannel ssChannel = ServerSocketChannel.open();FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);//2. 绑定连接ssChannel.bind(new InetSocketAddress(9898));//3. 获取客户端连接的通道SocketChannel sChannel = ssChannel.accept();//4. 分配指定大小的缓冲区ByteBuffer buf = ByteBuffer.allocate(1024);//5. 接收客户端的数据,并保存到本地while(sChannel.read(buf) != -1){buf.flip();outChannel.write(buf);buf.clear();}//6. 关闭通道sChannel.close();outChannel.close();ssChannel.close();}}
例子二:客户端向服务器端发送数据,服务器端向客户端反馈信息
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;import org.junit.Test;public class TestBlockingNIO2 {//客户端@Testpublic void client() throws IOException{SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);ByteBuffer buf = ByteBuffer.allocate(1024);while(inChannel.read(buf) != -1){buf.flip();sChannel.write(buf);buf.clear();}sChannel.shutdownOutput();//接收服务端的反馈int len = 0;while((len = sChannel.read(buf)) != -1){buf.flip();System.out.println(new String(buf.array(), 0, len));buf.clear();}inChannel.close();sChannel.close();}//服务端@Testpublic void server() throws IOException{ServerSocketChannel ssChannel = ServerSocketChannel.open();FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);ssChannel.bind(new InetSocketAddress(9898));SocketChannel sChannel = ssChannel.accept();ByteBuffer buf = ByteBuffer.allocate(1024);while(sChannel.read(buf) != -1){buf.flip();outChannel.write(buf);buf.clear();}//发送反馈给客户端buf.put("服务端接收数据成功".getBytes());buf.flip();sChannel.write(buf);sChannel.close();outChannel.close();ssChannel.close();}}
0 0
- 5. Java NIO系列之阻塞式IO
- java之非阻塞IO(NIO)
- 6. Java NIO系列之非阻塞式操作
- Java NIO之阻塞式
- Java NIO和阻塞IO
- Java NIO之非阻塞式
- java NIO(non-blocking I/O) 非阻塞式io
- java非阻塞式IO NIO 初步认识
- Java-NIO(七):阻塞IO与非阻塞IO
- Java NIO与阻塞IO的研究
- Java NIO 之阻塞与非阻塞
- java NIO 及 阻塞和非阻塞IO
- Java NIO中的阻塞与非阻塞IO
- Java IO:面向缓冲区、同步、非阻塞式IO(NIO)
- Java NIO 之 NIO与IO比较
- Java 之NIO(五) - 非阻塞式网络通信
- Java之IO、NIO、Buffer
- Java NIO之【Scalable IO】
- 配置C3P0连接
- Longest Substring Without Repeating Characters
- Fragment的导包问题和相关注意点
- 5、uboot源码——start_armboot函数
- 渣渣渣变渣渣系列(4)
- 5. Java NIO系列之阻塞式IO
- 算法训练 矩阵加法
- spring ioc原理(看完后大家可以自己写一个spring)
- groupcache分析(一) -单机环境下的groupcache分析
- 36.47.17.64
- 【C】扫雷游戏
- CJOJ 1504 整数合并
- 动态规划——石子合并
- HDU