`

Java NIO实例

阅读更多

一个可运行的简单NIO实例,首先是一个抽象的服务端类AbstractNIOServer

 

public abstract class AbstractNIOServer implements Runnable {

    // 要监听的端口号
    protected int port;
    // 生成一个信号监视器
    protected Selector s;

    public AbstractNIOServer(int port) {
        this.port = port;
        try {
            s = Selector.open();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            // 生成一个ServerScoket通道的实例对象,用于侦听可能发生的IO事件
            ServerSocketChannel ssc = ServerSocketChannel.open();
            // 将该通道设置为异步方式
            ssc.configureBlocking(false);
            // 绑定到一个指定的端口
            ssc.socket().bind(new InetSocketAddress(port));
            // 注册特定类型的事件到信号监视器上
            ssc.register(s, SelectionKey.OP_ACCEPT);
            System.out.println("The server has been launched...");
            while (true) {
                // 将会阻塞执行,直到有事件发生
                s.select();
                Iterator<SelectionKey> it = s.selectedKeys().iterator();
                while (it.hasNext()) {
                    SelectionKey key = it.next();
                    // key定义了四种不同形式的操作
                    switch (key.readyOps()) {
                        case SelectionKey.OP_ACCEPT:
                            dealwithAccept(key);
                            break;
                        case SelectionKey.OP_CONNECT:
                            break;
                        case SelectionKey.OP_READ:
                            dealwithRead(key);
                            break;
                        case SelectionKey.OP_WRITE:
                            break;
                    }
                    // 处理结束后移除当前事件,以免重复处理
                    it.remove();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 处理接收连接的事件
    public abstract void dealwithAccept(SelectionKey key);

    // 处理客户端发来的消息,处理读事件
    public abstract void dealwithRead(SelectionKey key);

}

 服务端实现类SynServer

 

class SynServer extends AbstractNIOServer {
    public SynServer(int port) {
        super(port);
    }

    // 读缓冲区
    private ByteBuffer r_bBuf = ByteBuffer.allocate(1024);
    private ByteBuffer w_bBuf;

    // 处理接收连接的事件
    @Override
    public void dealwithAccept(SelectionKey key) {
        try {
            System.out.println("新的客户端请求连接...");
            ServerSocketChannel server = (ServerSocketChannel) key.channel();
            SocketChannel sc = server.accept();
            sc.configureBlocking(false);
            // 注册读事件
            sc.register(s, SelectionKey.OP_READ);
            System.out.println("客户端连接成功...");

            // 更新最新域模型
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 处理客户端发来的消息,处理读事件
    @Override
    public void dealwithRead(SelectionKey key) {
        try {
            SocketChannel sc = (SocketChannel) key.channel();
            System.out.println("读入数据");
            r_bBuf.clear();
            // 将字节序列从此通道中读入给定的缓冲区r_bBuf
            sc.read(r_bBuf);
            r_bBuf.flip();
            String msg = Charset.forName("UTF-8").decode(r_bBuf).toString();
            if (msg.equalsIgnoreCase("time")) {
                w_bBuf = ByteBuffer.wrap(getCurrentTime().getBytes("UTF-8"));
                sc.write(w_bBuf);
                w_bBuf.clear();
            } else if (msg.equalsIgnoreCase("bye")) {
                sc.write(ByteBuffer.wrap("已经与服务器断开连接".getBytes("UTF-8")));
                sc.socket().close();
            } else {
                sc.write(ByteBuffer.wrap(msg.getBytes("UTF-8")));
            }
            System.out.println(msg);
            System.out.println("处理完毕...");
            r_bBuf.clear();
            try {
                Thread.currentThread();
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String getCurrentTime() {
        Calendar date = Calendar.getInstance();
        String time = "服务器当前时间:" + date.get(Calendar.YEAR) + "-" + date.get(Calendar.MONTH) + 1 + "-"
                      + date.get(Calendar.DATE) + " " + date.get(Calendar.HOUR) + ":" + date.get(Calendar.MINUTE) + ":"
                      + date.get(Calendar.SECOND);
        return time;
    }
}

服务端测试类TestServer

public class TestServer {


    public static void main(String[] args) {
        Executors.newSingleThreadExecutor().submit(new SynServer(1982));
        // new Thread().start();
    }
}

 

客户端测试类TestClient

 

public class TestClient {
    public static void main(String[] args) {
        new MiniClient("localhost", 1982);
    }
}

class MiniClient {
    private SocketChannel sc;
    private ByteBuffer w_bBuf;
    private ByteBuffer r_bBuf = ByteBuffer.allocate(1024);
    
    public MiniClient(String host, int port) {
        try {
            InetSocketAddress remote = new InetSocketAddress(host, port);
            sc = SocketChannel.open();
            sc.connect(remote);
            if (sc.finishConnect()) {
                System.out.println("已经与服务器成功建立连接...");
            }
            while (true) {
                if (!sc.socket().isConnected()) {
                    System.out.println("已经与服务器失去了连接...");
                    return;
                }
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                String str = br.readLine();
                System.out.println("读入一行数据,开始发送...");
                w_bBuf = ByteBuffer.wrap(str.getBytes("UTF-8"));
                // 将缓冲区中数据写入通道
                sc.write(w_bBuf);
                System.out.println("数据发送成功...");
                w_bBuf.clear();
                System.out.println("接收服务器端响应消息...");
                try {
                    Thread.currentThread();
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                r_bBuf.clear();
                // 将字节序列从此通道中读入给定的缓冲区r_bBuf
                sc.read(r_bBuf);
                r_bBuf.flip();
                String msg = Charset.forName("UTF-8").decode(r_bBuf).toString();
                System.out.println(msg);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
分享到:
评论

相关推荐

    javaNIO实例

    在这个javaNIO实例中,我们可以学习到如何利用Java NIO进行文件的读取、写入以及复制操作。 首先,NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是数据传输的路径,如文件通道...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...

    Java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java程序员提供了更高效、灵活的I/O操作方式。NIO与传统的 Blocking I/O(阻塞I/O)相比,主要的...

    Java NIO实例UDP发送接收数据代码分享

    "Java NIO实例UDP发送接收数据代码分享" Java NIO(Non-blocking I/O)是一种异步I/O模型,允许开发者在单个线程中处理多个I/O操作,从而提高程序的性能和可扩展性。在Java NIO中,DatagramChannel是专门用于发送...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...

    java NIO推送实例

    在这个实例中,"java NIO 消息推送实例" 旨在展示如何使用NIO进行服务器向客户端的消息推送。 1. **Java NIO基础** - **通道(Channels)**:Java NIO 提供了多种通道,如文件通道、套接字通道等,它们代表不同...

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java-nio.rar_java nio_nio 对象实例化

    在标题中提到的“java-nio.rar_java nio_nio 对象实例化”,我们可以理解为这个压缩包中包含了关于Java NIO对象实例化的具体示例或教程。下面我们将详细讨论NIO中的核心对象及其实例化方法。 1. **通道(Channel)*...

    JavaNIO服务器实例Java开发Java经验技巧共6页

    本资料"JavaNIO服务器实例Java开发Java经验技巧共6页"可能是某个Java开发者或讲师分享的一份关于如何在Java中构建NIO服务器的教程,涵盖了6个关键页面的内容。尽管具体的细节无法在此直接提供,但我们可以根据Java ...

    Java NIO原理分析及代码实例

    Java NIO(New IO)是Java 1.4版本引入的一个新API,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO...在实际编码时,参考博文链接中的代码实例,可以帮助你更好地理解和实践Java NIO。

    java nio 读文件

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于标准Java IO API的处理I/O操作的方式。NIO的主要特点是面向缓冲区,非阻塞I/O,以及选择器,这些特性使得NIO在处理大量并发连接时表现出更高...

    基于java NIO的socket通信demo

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,...对于理解和实践Java NIO在网络编程中的应用,这是一个非常有价值的参考实例。

    java nio im(server+client)

    总之,这个Java NIO IM实例是一个很好的学习资源,它演示了如何利用NIO进行高效的网络通信。通过深入理解并实践这个示例,开发者可以更好地掌握Java NIO的核心概念和技术,并将其应用于实际项目中,提升系统的性能和...

    Java NIO详解及源码下载

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为Non-blocking Input/Output,它提供了一种不同于传统IO的编程模型,传统IO基于块I/O(Blocking I/O),而NIO则基于通道(Channels)和缓冲区(Buffers)...

    JAVA-NIO程序设计完整实例

    **JAVA-NIO程序设计完整实例** Java NIO(New IO)是Java 1.4引入的一个新特性,它为Java提供了非阻塞I/O操作的能力,使得Java在处理I/O时更加高效。NIO与传统的BIO(Blocking I/O)模型相比,其核心在于它允许程序...

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的BIO( Blocking I/O)相比,NIO...对于初学者来说,这些源码实例可以帮助理解Java NIO的基本用法和优势,进一步提升在实际项目中的应用能力。

    NIO与零拷贝_javanio_nio和零拷贝_

    Java NIO(New IO)是Java 1.4引入的一个新特性,它是对传统IO模型的重大改进,提供了更高效的数据处理方式。NIO的核心概念包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。它允许多个输入/输出操作...

    Java NIO原理 图文分析及代码实现

    ### Java NIO原理 图文分析及代码实现 #### 前言 在深入探讨Java NIO之前,我们先简要回顾一下NIO的概念及其引入的原因。随着互联网的发展,越来越多的应用程序需要处理高并发的网络连接请求。传统的阻塞I/O模型在...

Global site tag (gtag.js) - Google Analytics