zoukankan      html  css  js  c++  java
  • Java NIO学习笔记六 SocketChannel 和 ServerSocketChannel

    Java NIO SocketChannel

      Java NIO SocketChannel是连接到TCP网络socket(套接字)的通道。Java NIO相当于Java Networking的socket(套接字)。有两种创建SocketChannel的方法

    1. 打开SocketChannel并连接到互联网上的某个服务器。
    2. 当一个连接接入到一个ServerSocketChannel时,SocketChannel就会被创建

    打开一个SocketChannel

      打开一个SocketChannel

    SocketChannel socketChannel = SocketChannel.open();
    socketChannel.connect(new InetSocketAddress(“http://jenkov.com”,80));

    关闭SocketChannel

      使用完SocketChannel后,可以通过调用SocketChannel的close()方法,将其关闭。

    代码展示:

    socketChannel.close();  

    从SocketChannel读取数据

      要从SocketChannel您那里读取数据,可以调用read()方法。

    代码:

    ByteBuffer buf = ByteBuffer.allocate(48);
    
    int bytesRead = socketChannel.read(buf);

    首先:进行Buffer分配,从SocketChannel中读取的数据到Buffer中

    然后:调用SocketChannel的read()方法。将数据从SocketChannel中读Buffer。返回值是int,表示有多少字节数据被读入到Buffer缓存中。如果返回-1,则到达端到端(连接已关闭)。

    数据写入SocketChannel

      SocketChannel使用SocketChannel的write() 方法来写入数据,该方法使用Buffer做参数。

    代码展示:

    String newData =“要写入文件的新字符串...”+ System.currentTimeMillis();
    
    ByteBuffer buf = ByteBuffer.allocate(48);
    buf.clear();
    buf.put(newData.getBytes());
    
    buf.flip();
    
    while(buf.hasRemaining()){
        channel.write(buf);
    }

      注意SocketChannel.write()在while循环中如何调用该方法。不能保证write()方法写入SocketChannel的字节数。因此,我们重复调用write(),直到Buffer没有字节可以写入。

    非阻塞模式

      您可以将SocketChannel设置为非阻塞模式。在非阻塞模式下,你可以以异步方式调用connect()read()write()方法

    connect()

      如果SocketChannel是非阻塞模式,并且您调用connect(),方法可能会在建立连接之前返回。要确定连接是否建立,可以调用finishConnect()方法,如下所示:

    socketChannel.configureBlocking(假);
    socketChannel.connect(new InetSocketAddress(“http://jenkov.com”,80));
    
    while(!socketChannel.finishConnect()){
        //做其他的事情    
    }

    write()

      在非阻塞模式下,write()方法在不写任何数据的情况下可以返回。因此,你需要在循环中调用write()方法。代码同上。

    read()

      在非阻塞模式下,read()方法可以在没有读取任何数据的情况下返回。因此,您需要注意返回的值int,这表示读取了多少个字节。

    具有选择器的非阻塞模式

      这种非阻塞模式的SocketChannel效果要比Selector好点通过使用Selector注册一个或一个以上SocketChannel,你可以访问已经准备读、写通道的Selector。

    Java NIO ServerSocketChannel

      Java NIO ServerSocketChannel是可以监听接入TCP连接的通道,就像ServerSocket的Java标准网络一样。ServerSocketChannel类位于java.nio.channels包中。

    java代码展示:

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    
    serverSocketChannel.socket().bind(new InetSocketAddress(9999));
    
    whiletrue){
        SocketChannel socketChannel =
                serverSocketChannel.accept();
    
        //用socketChannel做一些事情...
    }

    开启ServerSocketChannel

      通过调用ServerSocketChannel的open() 方法,你可以打开一个ServerSocketChannel

    代码展示:

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

    关闭ServerSocketChannel

      通过调用ServerSocketChannel的close() 方法来关闭ServerSocketChannel。这是怎么样的样子:

    serverSocketChannel.close();

    监听接入的连接

      通过调用ServerSocketChannel的accept() 方法来监听传接入连接。当该accept()方法返回时,它返回SocketChannel一个传入连接。因此,accept()方法阻塞直到有连接介入。

      我们通常不会对单个连接进行监听,所以您可以在accept()内部调用一个循环,来监听多个接入的连接。

    代码展示:

    whiletrue){
        SocketChannel socketChannel = serverSocketChannel.accept();
    
        //用socketChannel做一些事情...
    }

    非阻塞模式

      ServerSocketChannel可以设置为非阻塞模式。在非阻塞模式下,accept()方法立即返回,如果没有连接,则返回null。因此,您必须检查返回值 SocketChannel是否为空。

    代码展示:

    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    
    serverSocketChannel.socket()。bind(new InetSocketAddress(9999));
    serverSocketChannel.configureBlocking(false);
    
    whiletrue){
        SocketChannel socketChannel =
                serverSocketChannel.accept();
    
        if(socketChannel!= null){
            //用socketChannel做一些事情...
            }
    }
  • 相关阅读:
    Apache Shiro在web开发安全框架中的应用
    大数据分布式存储方案的两种部署模式-分离式和超融合
    [想明白]你真的愿意把荣誉归给团队或他人吗?
    [想明白]如果你要选择工作,是大公司还是小公司?
    [杂谈]交通工具orca card
    [IT新应用]农民朋友的电子商务
    [听听音乐]love is blue
    [学点英语]扎克伯格给女儿的信,translation of zucherber's letter to her daughter( Chinese version)
    [IT学习]微软如何做网站内容治理
    [IT学习]PowerBi 入门
  • 原文地址:https://www.cnblogs.com/kuoAT/p/7016905.html
Copyright © 2011-2022 走看看