【对线面试官】Java NIO - 图1

    【对线面试官】Java NIO - 图2

    【对线面试官】Java NIO - 图3

    【对线面试官】Java NIO - 图4

    【对线面试官】Java NIO - 图5

    服务端:

    【对线面试官】Java NIO - 图6

    1. public class NoBlockServer {
    2. public static void main(String[] args) throws IOException {
    3. // 1.获取通道
    4. ServerSocketChannel server = ServerSocketChannel.open();
    5. // 2.切换成非阻塞模式
    6. server.configureBlocking(false);
    7. // 3. 绑定连接
    8. server.bind(new InetSocketAddress(6666));
    9. // 4. 获取选择器
    10. Selector selector = Selector.open();
    11. // 4.1将通道注册到选择器上,指定接收“监听通道”事件
    12. server.register(selector, SelectionKey.OP_ACCEPT);
    13. // 5. 轮训地获取选择器上已“就绪”的事件--->只要select()>0,说明已就绪
    14. while (selector.select() > 0) {
    15. // 6. 获取当前选择器所有注册的“选择键”(已就绪的监听事件)
    16. Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
    17. // 7. 获取已“就绪”的事件,(不同的事件做不同的事)
    18. while (iterator.hasNext()) {
    19. SelectionKey selectionKey = iterator.next();
    20. // 接收事件就绪
    21. if (selectionKey.isAcceptable()) {
    22. // 8. 获取客户端的链接
    23. SocketChannel client = server.accept();
    24. // 8.1 切换成非阻塞状态
    25. client.configureBlocking(false);
    26. // 8.2 注册到选择器上-->拿到客户端的连接为了读取通道的数据(监听读就绪事件)
    27. client.register(selector, SelectionKey.OP_READ);
    28. } else if (selectionKey.isReadable()) { // 读事件就绪
    29. // 9. 获取当前选择器读就绪状态的通道
    30. SocketChannel client = (SocketChannel) selectionKey.channel();
    31. // 9.1读取数据
    32. ByteBuffer buffer = ByteBuffer.allocate(1024);
    33. // 9.2得到文件通道,将客户端传递过来的图片写到本地项目下(写模式、没有则创建)
    34. FileChannel outChannel = FileChannel.open(Paths.get("2.png"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
    35. while (client.read(buffer) > 0) {
    36. // 在读之前都要切换成读模式
    37. buffer.flip();
    38. outChannel.write(buffer);
    39. // 读完切换成写模式,能让管道继续读取文件的数据
    40. buffer.clear();
    41. }
    42. }
    43. // 10. 取消选择键(已经处理过的事件,就应该取消掉了)
    44. iterator.remove();
    45. }
    46. }
    47. }
    48. }

    客户端:

    【对线面试官】Java NIO - 图7

    1. public class NoBlockClient {
    2. public static void main(String[] args) throws IOException {
    3. // 1. 获取通道
    4. SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 6666));
    5. // 1.1切换成非阻塞模式
    6. socketChannel.configureBlocking(false);
    7. // 1.2获取选择器
    8. Selector selector = Selector.open();
    9. // 1.3将通道注册到选择器中,获取服务端返回的数据
    10. socketChannel.register(selector, SelectionKey.OP_READ);
    11. // 2. 发送一张图片给服务端吧
    12. FileChannel fileChannel = FileChannel.open(Paths.get("X:\\Users\\ozc\\Desktop\\面试造火箭\\1.png"), StandardOpenOption.READ);
    13. // 3.要使用NIO,有了Channel,就必然要有Buffer,Buffer是与数据打交道的呢
    14. ByteBuffer buffer = ByteBuffer.allocate(1024);
    15. // 4.读取本地文件(图片),发送到服务器
    16. while (fileChannel.read(buffer) != -1) {
    17. // 在读之前都要切换成读模式
    18. buffer.flip();
    19. socketChannel.write(buffer);
    20. // 读完切换成写模式,能让管道继续读取文件的数据
    21. buffer.clear();
    22. }
    23. // 5. 轮训地获取选择器上已“就绪”的事件--->只要select()>0,说明已就绪
    24. while (selector.select() > 0) {
    25. // 6. 获取当前选择器所有注册的“选择键”(已就绪的监听事件)
    26. Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
    27. // 7. 获取已“就绪”的事件,(不同的事件做不同的事)
    28. while (iterator.hasNext()) {
    29. SelectionKey selectionKey = iterator.next();
    30. // 8. 读事件就绪
    31. if (selectionKey.isReadable()) {
    32. // 8.1得到对应的通道
    33. SocketChannel channel = (SocketChannel) selectionKey.channel();
    34. ByteBuffer responseBuffer = ByteBuffer.allocate(1024);
    35. // 9. 知道服务端要返回响应的数据给客户端,客户端在这里接收
    36. int readBytes = channel.read(responseBuffer);
    37. if (readBytes > 0) {
    38. // 切换读模式
    39. responseBuffer.flip();
    40. System.out.println(new String(responseBuffer.array(), 0, readBytes));
    41. }
    42. }
    43. // 10. 取消选择键(已经处理过的事件,就应该取消掉了)
    44. iterator.remove();
    45. }
    46. }
    47. }
    48. }

    【对线面试官】Java NIO - 图8

    【对线面试官】Java NIO - 图9

    【对线面试官】Java NIO - 图10

    【对线面试官】Java NIO - 图11

    【对线面试官】Java NIO - 图12

    【对线面试官】Java NIO - 图13

    【对线面试官】Java NIO - 图14

    【对线面试官】Java NIO - 图15

    【对线面试官】Java NIO - 图16

    【对线面试官】Java NIO - 图17

    【对线面试官】Java NIO - 图18

    【对线面试官】系列 一周两篇持续更新中!