您的位置:威尼斯官方网站 > 威尼斯正规官网 > 威尼斯官方网站在while循环中调用 accept()方法. 

威尼斯官方网站在while循环中调用 accept()方法. 

发布时间:2019-08-12 14:53编辑:威尼斯正规官网浏览(158)

    JAVA-7NIO之Socket/ServerSocket Channel,niosocketchannel

    一、ServerSocketChannel

    Java NIO中的 ServerSocketChannel 是三个得以监听新进入的TCP连接的大路, 就好像专门的学业IO中的ServerSocket同样。ServerSocketChannel类在 java.nio.channels包中。

    打开 ServerSocketChannel

    由此调用 ServerSocketChannel.open() 方法来开发ServerSocketChannel.

    关闭 ServerSocketChannel

    因此调用ServerSocketChannel.close() 方法来关闭ServerSocketChannel. 

    监听新步入的连日

    透过 ServerSocketChannel.accept() 方法监听新步向的延续。当 accept()方法重返的时候,它回到三个分包新步向的连天的 SocketChannel。因而, accept()方法会一直不通到有新连接达到。

    一般说来不会单独只监听三个连接,在while循环中调用 accept()方法. 

    自然,也足以在while循环中动用除了true以外的别的退出法规。

    非阻塞方式

    ServerSocketChannel能够安装成非阻塞情势。在非阻塞情势下,accept() 方法会立时回到,假诺还并未有新步入的接连,重临的将是null。 由此,必要检查再次回到的SocketChannel是还是不是是null.如:

        /**
         * socket server channel
         */
        @Test
        public void text2() throws IOException {
            ServerSocketChannel channel = ServerSocketChannel.open();    //新建channel
            channel.socket().bind(new InetSocketAddress(9999));     //监听端口
            channel.configureBlocking(true);                             //设置阻塞
    
            while (true) {
                SocketChannel accept = channel.accept();                    //设置为阻塞,则此方法阻塞,直到有连接
                //如果设置为非阻塞,需要在这里判断 accept == null?
                ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                accept.read(byteBuffer);
                byteBuffer.flip();                                    //反转
                while (byteBuffer.hasRemaining()) {                   //判断
                    System.err.println((char)byteBuffer.get());       //输出
                }
            }
        }
    

     

    二、SocketChannel

    Java NIO中的SocketChannel是七个总是到TCP互联网套接字的大道。能够通过以下2种方法开创SocketChannel:

    打开 SocketChannel

    上面是SocketChannel的张开药情势:

    关闭 SocketChannel

    当用完SocketChannel之后调用SocketChannel.close()关闭SocketChannel:

    从 SocketChannel 读取数据

    要从SocketChannel中读取数据,调用一个read()的主意之一。

    率先,分配二个Buffer。从SocketChannel读取到的数据将会停放那么些Buffer中。

    下一场,调用SocketChannel.read()。该方式将数据从SocketChannel 读到Buffer中。read()方法重返的int值表示读了不怎么字节进Buffer里。假若回去的是-1,表示已经读到了流的结尾(连接关闭了)。

    写入 SocketChannel

    写多少到SocketChannel用的是SocketChannel.write()方法,该方式以贰个Buffer作为参数。

    小心SocketChannel.write()方法的调用是在八个while循环中的。Write()方法不可能担保能写多少字节到SocketChannel。所以,我们再次调用write()直到Buffer未有要写的字节结束。

    非阻塞形式

    能够安装 SocketChannel 为非阻塞形式(non-blocking mode).设置之后,就足以在异步情势下调用connect(), read() 和write()了。

    connect()

    设若SocketChannel在非阻塞方式下,此时调用connect(),该情势或然在连年建构之前就再次来到了。为了显著连接是还是不是制造,能够调用finishConnect()的方式。

     

    write()

    非阻塞情势下,write()方法在未曾写出别样内容时或者就回去了。所以需求在循环中调用write()。前面已经有例子了,这里就不赘述了。

    read()

    非阻塞方式下,read()方法在平素不读取到其它数据时也许就重回了。所以需求关爱它的int再次来到值,它会告诉你读取了略微字节。

    非阻塞形式与采用器

    非阻塞格局与接纳器搭配会职业的越来越好,通过将一或多少个SocketChannel注册到Selector,能够了然选用器哪个通道早就计划好了读取,写入等。Selector与SocketChannel的反衬使用会在后头详讲。

    /**
         * socket channel
         */
        @Test
        public void test3() throws IOException {
            SocketChannel channel = SocketChannel.open();                               //新建服务端
            channel.connect(new InetSocketAddress("127.0.0.1",9999));   //连接服务端地址
            ByteBuffer byteBuffer = ByteBuffer.allocate(1024);  //缓冲区
            byteBuffer.put("123".getBytes());
            byteBuffer.flip();                                  //反转
            while (byteBuffer.hasRemaining()) {                 //判断
                channel.write(byteBuffer);
            }
        }
    

     

    Channel,niosocketchannel 一、ServerSocketChannel Java NIO中的 ServerSocketChannel 是四个方可监听新步入的TCP连接的通道, 就像是标...

    本文由威尼斯官方网站发布于威尼斯正规官网,转载请注明出处:威尼斯官方网站在while循环中调用 accept()方法. 

    关键词:

上一篇:支持随机访问文件

下一篇:没有了