网络编程模型之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数组成功执行了..

原文地址:https://www.cnblogs.com/hyy9527/p/13058191.html