文档章节

Java NIO简单使用

秋风醉了
 秋风醉了
发布于 2014/06/19 16:22
字数 721
阅读 199
收藏 8

Java NIO简单使用

看代码

package nio2;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;

public class PlainNioServer {

    public void serve(int port) throws IOException {
        System.out.println("Listening for connections on port " + port);

        //声明服务器端ServerSocketChannel通道
        ServerSocketChannel serverChannel;
        //声明一个多路复用器Selector
        Selector selector;

        serverChannel = ServerSocketChannel.open();
        ServerSocket ss = serverChannel.socket();
        InetSocketAddress address = new InetSocketAddress(port);
        ss.bind(address);

        serverChannel.configureBlocking(false);
        selector = Selector.open();

        /**
         * Registers this channel with the given selector, returning a selection
         * key.
         * The interest set for the resulting key
         */
        serverChannel.register(selector, SelectionKey.OP_ACCEPT);
        final ByteBuffer msg = ByteBuffer.wrap("Hi!\r\n".getBytes());

        while (true) {
            try {
                System.out.println(">>>>>等待感兴趣事件已经就绪的通道>>>>");
                selector.select();
            } catch (IOException ex) {
                ex.printStackTrace();
                break;
            }

            System.out.println(">>>>>返回就绪通道的键值>>>>>");
            Set readyKeys = selector.selectedKeys();
            Iterator iterator = readyKeys.iterator();

            while (iterator.hasNext()) {
                SelectionKey key = (SelectionKey) iterator.next();
                iterator.remove();
                try {
                    if (key.isAcceptable()) {
                        System.out.println("--该键表示的通道的Accept事件就绪--");
                        ServerSocketChannel server = (ServerSocketChannel) key.channel();
                        SocketChannel client = server.accept();
                        System.out.println("Accepted connection from " + client);
                        client.configureBlocking(false);
                        client.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ, msg.duplicate());
                    }
                    if (key.isWritable()) {
                        System.out.println("--该键表示的通道的Writable事件就绪--");
                        SocketChannel client = (SocketChannel) key.channel();
                        ByteBuffer buffer = (ByteBuffer) key.attachment();
                        while (buffer.hasRemaining()) {
                            if (client.write(buffer) == 0) {
                                break;
                            }
                        }
                        client.close();
                    }
                } catch (IOException ex) {
                    key.cancel();
                    try {
                        key.channel().close();
                    } catch (IOException cex) {
                    }
                }

                System.out.println("++++++++++++++++++++++++++++++++++++++++++\r\n");
            }
        }
    }

    public static void main(String args[]) throws IOException {
        int port = 8080;
        PlainNioServer plainNioServer = new PlainNioServer();
        plainNioServer.serve(port);
    }
}


看结果分析Java NIO的处理过程

Listening for connections on port 8080

>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63535]

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63536]

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63538]

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63539]

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Accept事件就绪--

Accepted connection from java.nio.channels.SocketChannel[connected local=/127.0.0.1:8080 remote=/127.0.0.1:63540]

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

>>>>>返回就绪通道的键值>>>>>

--该键表示的通道的Writable事件就绪--

++++++++++++++++++++++++++++++++++++++++++


>>>>>等待感兴趣事件已经就绪的通道>>>>

==============END==============

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 239
博文 572
码字总数 416654
作品 0
朝阳
程序员
私信 提问
分别使用Java IO、NIO、Netty实现的一个Echo Server示例

分别使用Java IO、Java NIO、Netty来实现一个简单的EchoServer(即原样返回客户端的输入信息)。 Java IO int port = 9000;ServerSocket ss = new ServerSocket(port);while (true) {final S...

zgw06629
2015/05/24
0
0
Java NIO AsynchronousFileChannel

原文链接 , 原文作者:Jakob Jenkov, 翻译:Neil Hao 在Java 7,AsynchronousFileChannel 被添加到了Java NIO中。使用AsynchronousFileChannel可以实现异步地读取和写入文件数据。 创建一个A...

Neil_Hao
01/20
0
0
Java网络编程框架

自从JDK1.4中有了NIO以后,这个方面越来越活跃,也为java赢得更多开发者的支持。做java网络编程需要掌握一些基本的知识和技能: 套接字编程、阻塞/非阻塞通信、创建HTTP服务器与客户程序、数...

长平狐
2012/08/29
2.3K
0
使用J2SE进行服务器架构技术选型的变迁

虽然现在对大多数程序员来讲,基本不会再有使用Java开发一个服务器这样的任务,但是,这方面的技术研究一下,对自己的技术提高还是非常有帮助的。说不定啥时候能派上用场。 使用Java(J2SE)...

webas
2013/04/26
0
0
Java NIO原理 图文分析及代码实现

Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术...

囚兔
2015/04/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

龙芯jdk或java开发

龙芯的jdk安装包可以从www.loongnix.org下载。 4.支持的软件 龙芯JDK在每一次发布产品之前,都会使用一个应用程序列表进行兼容性测试,如表4-2所示。这个列表中既包含简单的Java应用程序,也...

gugudu
10分钟前
0
0
Docker + selenium + jenkins 并行跑自动化测试

背景 目标:使用docker做UI自动化测试并在Jenkins运行 调试环境:MocOS 运行环境:Linux ubuntu + docker 涉及工具:docker,selenium,unittest, jenkins 基本思路 找一个适合做自动化的doc...

呐呐丶嘿
14分钟前
1
0
android分辨率,屏幕尺寸,屏幕密度关系

名词定义分辨率分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800、720×1280、1080×1920等。720×1280表示此屏幕在宽度方向有720个像素...

GoldenVein
25分钟前
1
0
inux驱动的异步通知(kill_fasync,fasync)---- 驱动程序向应用程序发送信号

===========================应用程序========================= #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <poll.h> #include <sign......

天王盖地虎626
26分钟前
1
0
使用android studio时,ADB连接不上手机可能性之一

问题描述:as是通过adb连接手机进行调试了,如果电脑装了鲁大师,360等软件,可能会存在adb被这些软件占用的情况,所以会连接不上手机。这种解决方案有很多,比如通过任务管理器查看是谁占用...

白话
29分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部