1 package com.slp.nio;
2
3
4 import org.junit.Test;
5
6 import java.io.File;
7 import java.io.IOException;
8 import java.net.InetSocketAddress;
9 import java.nio.ByteBuffer;
10 import java.nio.channels.FileChannel;
11 import java.nio.channels.ServerSocketChannel;
12 import java.nio.channels.SocketChannel;
13 import java.nio.file.Paths;
14 import java.nio.file.StandardOpenOption;
15
16 /**
17 * Created by sanglp on 2017/3/1.
18 * 一、使用NIO完成网络通信的三个核心
19 * 1、通道:负责连接
20 * |--java.nio.channels.channel接口
21 * |--SelectableChannel
22 * |--SocketChannel
23 * |--ServerSocketChannel
24 * |--DatagramChannel
25 *
26 * |--Pipe.SinkChannel
27 * |--Pipe.SourceChannel
28 * 2、缓冲区:负责数据的存取
29 * 3、选择器:是SelectableChannel的多路复用器,用于监控SelectableChannel的IO状况
30 *
31 */
32 public class TestBlockingNIO {
33 //客户端
34 @org.junit.Test
35 public void client() throws IOException {
36 // 1、获取通道
37 SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1",9898));
38 FileChannel inChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.READ);
39 //2、分配指定大小的缓冲区
40 ByteBuffer buffer =ByteBuffer.allocate(1024);
41 //3、读取本地文件 并发送到服务端
42 while (inChannel.read(buffer)!=-1){
43 buffer.flip();
44 socketChannel.write(buffer);
45 buffer.clear();
46 }
47 //4、关闭通道
48 socketChannel.close();
49 inChannel.close();
50 }
51 //服务端
52 @Test
53 public void server() throws IOException {
54 //1、获取通道
55 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
56 FileChannel outChannel = FileChannel.open(Paths.get("3.jpg"),StandardOpenOption.WRITE,StandardOpenOption.CREATE);
57 //2、绑定连接
58 serverSocketChannel.bind(new InetSocketAddress(9898));
59 //3、获取客户端连接
60 SocketChannel socketChannel = serverSocketChannel.accept();
61 //4、分配指定大小的缓冲区
62 ByteBuffer buffer = ByteBuffer.allocate(1024);
63
64 //5、接收客户端的数据,并保存到本地
65
66 while (socketChannel.read(buffer)!=-1){
67 buffer.flip();
68 outChannel.write(buffer);
69 buffer.clear();
70 }
71 //关闭通道
72 socketChannel.close();
73 serverSocketChannel.close();
74
75 }
76 }