• 网络编程模型之NIO-ServerSocketChannel


    1.基本介绍

      Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。

    2.ServerSocketChannel 的创建

      通过ServerSocketChannel类的静态方法open()获得。

    3.端口的获取

      每个ServerSocketChannel都有一个对应的ServerSocket,通过其socket()方法获得。获得ServerSocket是为了使用其bind()方法绑定监听端口号。若是使用其accept()方法监听请求就和普通Socket的处理模式无异。

    4. 设置是否使用阻塞模式

      true/false。configureBlocking(false)——不适用阻塞模式。阻塞模式不能使用Selector!

    5.利用buffer数组完成读写操作

      5.1 模拟服务端

    /**
     * 1.模拟服务端
     * 2.利用buffer数组完成读写
     */
    public class ArrayBuffer {
        public static void main(String[] args) throws Exception {
            //  1. 创建serverSocketChannel
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            InetSocketAddress inetSocketAddress=new InetSocketAddress(7000);
            //   2.绑定端口
            serverSocketChannel.socket().bind(inetSocketAddress);
            //3.创建buffer数组
            ByteBuffer[]byteBuffers=new ByteBuffer[2];
            //4.设置每个buffer的容量
            byteBuffers[0]=ByteBuffer.allocate(5);
            byteBuffers[1]=ByteBuffer.allocate(3);
            //5.等待客户端(telnet)连接
            SocketChannel socketChannel=serverSocketChannel.accept();
            //6.循环读取
            int messageLength=8; //假设客户端只发送八个字节
            while (true){
                long byteRead=0;
                while (byteRead<messageLength){
                    long num = socketChannel.read(byteBuffers);
                    byteRead+=num;//累计读取的字节数量
                    System.out.println("byteRead="+byteRead);
                    //7.流打印,看当前buffer的position和limit
                    Arrays.asList(byteBuffers).stream().map(buffer->"position:"+buffer.position()+ ",limit:"+buffer.limit()).forEach(System.out::println);
                }
                //8.将所有的buffer进行flip
                Arrays.asList(byteBuffers).forEach(byteBuffer -> byteBuffer.flip());
                //9.将客户端发来的数据信息到服务端控制台
                long byteWrite=0;
                while (byteWrite<messageLength){
                    long write = socketChannel.write(byteBuffers);
                    byteWrite+=write;
                }
                //10.将所有的buffer进行clear
                Arrays.asList(byteBuffers).forEach(byteBuffer -> byteBuffer.clear());
                System.out.println("byteRead:"+byteRead+",byteWrite:"+byteWrite+",messageLength:"+messageLength);
            }
        }
    }

      5.2  telnet模拟客户端

        a.windows-7开启telnet

        

       b.命令行启动

        1.Telnet  服务器ip地址 端口号

        

        2. ctrl+]

        

        3. send +发送的消息

      5.3 控制台打印效果

    byteRead=8
    position:5,limit:5
    position:3,limit:3
    byteRead:8,byteWrite:8,messageLength8
    从上面控制台数据可以看出,buffer数组成功执行了..

  • 相关阅读:
    Ganglia与Centreon整合构建智能化监控报警平台
    通过Centreon监控apache、MySQL、Hadoop服务状态
    分布式监控告警平台Centreon快速使用
    分布式监控数据采集系统Ganglia实战
    Zabbix与ELK整合实现对日志数据的实时监控
    Zabbix通过与微信、钉钉整合实现实时告警
    详解容器设计模式
    深入理解 Pod
    docker exec实现原理
    使用Docker部署应用以及容器数据卷Volume
  • 原文地址:https://www.cnblogs.com/hyy9527/p/13058191.html
Copyright © 2020-2023  润新知