package com.nio; import com.sun.xml.internal.ws.server.ServerSchemaValidationTube; import org.junit.Test; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; /** * 一、使用NIO完成网络通信的三个核心 * 1.通道(Channel):负责连接 * java.nio.channels.Channel 接口 * |--SelectableChannel * |--SocketChannel * |--ServerSocketChannel * |--DatagramChannel * * |--Pipe.SinkChannel * |--Pipe.SourceChannel * * 2.缓存区(Buffer):负责数据的存取 * 3.选择器(Selector):是SelectableChannel 的多路复用器。用于监控SelectableChannel的IO状况 * * 注意:在启动的时候,先启动服务端,再启动客户端 */ public class TestBlockingNIO { //客户端 @Test public 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(); } //服务端 @Test public 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(); } }