美文网首页
网络NIO通道的使用

网络NIO通道的使用

作者: sunpy | 来源:发表于2018-08-22 22:30 被阅读34次

介绍

① ServerSocketChannel:对应的是服务端通道的实现。通过监听TCP/IP连接,对每一个新的连接创建新的SocketChannel。SocketChannel:通过TCP/IP协议读取网络数据,客户端连接通信。
② ServerSocketChannel使用调用 socket方法所获得的关联 对象来完成对套接字选项的绑定和操作。像open方法只是创建服务器套接字通道,但是却还未绑定IP和端口号。
③ SocketChannel本身是套接字通道,但是却不是真正的套接字。所以我们需要使用socket方法获取Sokcet套接字进行绑定IP和端口。
④ ServerSocketChannel、SocketChannel都支持非阻塞的连接。
注意:我们不能为已经创建的Socket的套接字创建通道。

例子

服务端:

public class NIOSocketServerTest {

    public static void main(String[] args) throws IOException {
        // 打开服务器套接字通道
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();   
        // 获取与此通道关联的服务器套接字
        ServerSocket socket = serverSocketChannel.socket();
        // 将 ServerSocket 绑定到特定地址(IP 地址和端口号)
        socket.bind(new InetSocketAddress("127.0.0.1", 9999));
        // 设置通道为非阻塞模式
        serverSocketChannel.configureBlocking(false);
        while (true) {
            SocketChannel socketChannel = serverSocketChannel.accept();
            
            if (socketChannel != null) {
                ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                // 将字节序列从此通道中读入给定的缓冲区
                socketChannel.read(byteBuffer);
                byteBuffer.flip();
                while (byteBuffer.hasRemaining()) {
                    System.out.print((char) byteBuffer.get());
                }
                
                socketChannel.close();
            }
            
            
        }
    }
}

客户端:

public class NIOSocketClientTest {
    
    public static void main(String[] args) throws IOException {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(false);
        socketChannel.connect(new InetSocketAddress("127.0.0.1", 9999));
        // 完成套接字通道的连接过程
        if (socketChannel.finishConnect()) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            buffer.put("sunpy".getBytes());
            buffer.flip();
            socketChannel.write(buffer);
            buffer.clear();
        } 
        socketChannel.close();
    }
}

解释:
connect方法作用是连接指定通道的套接字;finishConnect方法作用是完成套接字通道的连接过程。

结果:


2.jpg

问题:
看上面的例子可以发现服务器死循环的方式来一直等待客户端的连接和读写是不合理的。而这时就需要Selector选择器来解决这个问题。

相关文章

  • 网络NIO通道的使用

    介绍 ① ServerSocketChannel:对应的是服务端通道的实现。通过监听TCP/IP连接,对每一个新的...

  • Java NIO FileChannel

    Java NIO FileChannel Java NIO FileChannel是连接到文件的通道。 使用文件通...

  • java Nio

    NIO编程 网络IO的介绍 nio的概述 通道、 缓冲区、 选择器 网络IO 讲网络IO前,我们先对同步、异步、阻...

  • Java IO流 -- 03 Java的NIO

    导读目录 Java的NIO概述 使用Buffer(缓冲) 使用Channel(通道) 字符集和Charset 前面...

  • netty补充NIO的SelectableChannel和Sel

    SelectableChannel作为nio选择器和通道的关键 先看官方描述 简单总结: 它通道的注册使用大致过程...

  • Java I/O系统(2)——网络通信

    BIO网络模型 NIO网络模型 Channel Channel是信息传输的通道,具有双向性、非阻塞性、操作唯一性。...

  • Java NIO 记录(一)

    一、NIO简介 Java NIO (New IO , Non Blocking IO)。NIO是一个基于通道,...

  • Java NIO系列教程(三) Buffer

    Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的...

  • JAVA-NIO之Buffer

    Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的...

  • JAVA基础之NIO

    1、Buffer 1.1 概述 Java NIO中的Buffer用于和NIO通道进行交互,是将数据移进移出通道的唯...

网友评论

      本文标题:网络NIO通道的使用

      本文链接:https://www.haomeiwen.com/subject/txhuiftx.html