`

java NIO使用示例

    博客分类:
  • java
阅读更多

package com.mine;

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

public class SelectorDemo {

    public static int PORT_NUMBER = 1234;

    public static void main(String[] argv) throws Exception {
        new SelectorDemo().go(argv);
    }

    public void go(String[] argv) throws Exception {
        int port = PORT_NUMBER;
        if (argv.length > 0) {
            // Override default listen port
            port = Integer.parseInt(argv[0]);
        }
        System.out.println("Listening on port " + port); // Allocate an unbound server socket channel
        ServerSocketChannel serverChannel = ServerSocketChannel.open(); // 新建一个通道
        ServerSocket serverSocket = serverChannel.socket(); // 从通道获得一个socket连接
        Selector selector = Selector.open(); // 新建一个选择器
        serverSocket.bind(new InetSocketAddress(port)); // 把socket连接绑定到一个端口上
        serverChannel.configureBlocking(false); // 设置通道为非阻塞模式,只有非阻塞模式才能使用nio带来的好处,socket通道能设置为非阻塞的,文件通道不能设置为非阻塞的
        serverChannel.register(selector, SelectionKey.OP_ACCEPT); //把这个通道注册到一个选择器上,感兴趣的操作时OP_ACCEPT,等待连接
        while (true) {// 从选择器中循环选择已经准备好的选择器键,键就是保持通道跟选择器的对应关系
            int n = selector.select();  //从选择器中获得已经准备好的选择器键的个数
            if (n == 0) {
                continue; // nothing to do
            }// Get an iterator over the set of selected keys
            Iterator it = selector.selectedKeys().iterator(); // 遍历所有已经准备好的选择器键
            while (it.hasNext()) {
                SelectionKey key = (SelectionKey) it.next(); 
                if (key.isAcceptable()) { //如果该键是等待连接的状态
                    ServerSocketChannel server = (ServerSocketChannel) key.channel(); //从改键中获取已经准备连接好的server socket通道
                    SocketChannel channel = server.accept(); //从server socket通道获得本次socket连接
                    registerChannel(selector, channel, SelectionKey.OP_READ); //把该连接注册为可读的操作状态
                    sayHello(channel);//往该socket连接发送数据
                }// Is there data to read on this channel?
                if (key.isReadable()) { //下次当该链接为可读的时候
                    readDataFromSocket(key);//接收该socket链接的数据,并显示
                }// Remove key from selected set; it's been handled
                it.remove();//删除本次已经执行过的准备好的键,下次再执行selector.select(),仍然能选出所有已经准备好的键
            }
        }
    }

    protected void registerChannel(Selector selector, SelectableChannel channel, int ops) throws Exception {
        if (channel == null) {
            return; 
        }
        channel.configureBlocking(false); //设置通道为非阻塞模式 
        channel.register(selector, ops);//把该连接注册为可读的操作状态
    }

    private ByteBuffer buffer = ByteBuffer.allocateDirect(1024);


    protected void readDataFromSocket(SelectionKey key) throws Exception {
        SocketChannel socketChannel = (SocketChannel) key.channel();
        int count;
        buffer.clear(); 
        while ((count = socketChannel.read(buffer)) > 0) { //从通道里面独处数据
            buffer.flip(); //标准该通道的数据是可读的
            while (buffer.hasRemaining()) {
                socketChannel.write(buffer);//往通道里面写数据
            }
            buffer.clear(); 
            if (count < 0) {
                socketChannel.close();
            }
        }
    }
    private void sayHello(SocketChannel channel) throws Exception {
        buffer.clear();
        buffer.put("Hi there!\r\n".getBytes());
        buffer.flip();
        channel.write(buffer);
    }
}

 

 

执行该程序,用telnet登陆本机的1234端口,你输入一个字符,程序把接收到的字符发送出去。

 


  • 大小: 135.7 KB
分享到:
评论

相关推荐

    一个java NIO的例子

    本例子中的"NioServer"可能是一个简单的Java NIO服务器端程序,用于演示如何使用NIO进行网络通信。下面我们将深入探讨Java NIO的关键组件和工作原理。 1. **通道(Channel)**:通道是数据传输的途径,类似于传统的...

    Java NIO测试示例

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

    java nio示例代码

    这些示例通常会包含简单的读写文件、服务器端与客户端的通信以及多路复用的使用,帮助初学者快速理解NIO的工作原理和实际应用。在学习过程中,你可以逐步深入,从基础的Buffer操作到复杂的Selector机制,掌握Java ...

    JAVA nio的一个简单的例子

    在这个“JAVA nio的一个简单的例子”中,我们将探讨如何使用Java NIO进行简单的服务器-客户端通信,并计算字符串的哈希值。 在传统的BIO模型中,每个连接都需要一个线程来处理,当并发连接数量增加时,系统会创建...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 ...综上所述,使用Java NIO处理超大数据文件时,关键是利用好内存映射文件技术和合理的数据读取策略,通过适当的分块和数据解析方法,可以有效地提升读取速度和处理能力。

    JavaNIO.zip_java nio_nio java

    下面是一些关键的Java NIO使用示例: 1. **读取文件**:使用FileChannel从文件中读取数据到缓冲区,然后从缓冲区获取数据。 ```java FileInputStream fis = new FileInputStream("file.txt"); FileChannel channel ...

    java nio socket 例子

    本例包含服务器端和客户端,多线程,每线程多次发送,Eclipse工程,启动服务器使用 nu.javafaq.server.NioServer,启动客户端使用 nu.javafaq.client.NioClient。另本例取自javafaq.nv上的程序修改而成

    Java Nio selector例程

    我研究并实现的Java Nio selector例子。java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server...

    java nio 实现socket

    在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O模型**:在传统的Java IO编程中,当我们调用`read()`或`write()`方法时,...

    Java.NIO资源下载资源下载

    例如,书中提到了使用 Java NIO 可以提高应用程序的响应性、可扩展性和可靠性等。 ### Java NIO API 与旧版 I/O API 的关系 值得注意的是,Java NIO API 是对旧版 I/O API 的补充而非替代。这意味着开发者需要了解...

    java nio 读文件

    二、使用Java NIO读取文件 在Java NIO中,读取文件主要涉及FileChannel和ByteBuffer。以下是一个简单的示例: ```java import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels....

    基于java NIO的socket通信demo

    总的来说,这个示例展示了如何使用Java NIO进行Socket通信,通过非阻塞的方式提高系统的并发处理能力。同时,它还演示了如何处理字符集问题,保证了跨平台数据交换的准确性。对于理解和实践Java NIO在网络编程中的...

    java NIO详细教程

    #### 五、Java NIO 示例 ##### Channel和Buffer操作示例 ```java // 创建一个FileChannel FileChannel fileChannel = new FileInputStream(file).getChannel(); // 创建一个ByteBuffer ByteBuffer buffer = ...

    java NIO原理和使用

    下面是一个简单的 Java NIO 示例,展示了如何使用 `FileChannel` 和 `ByteBuffer` 进行文件复制: ```java package nio; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio....

    JAVA NIO学习网站

    博主还可能分享了实际示例代码,帮助读者更好地理解和掌握Java NIO。 至于`.classpath`和`.project`文件,它们是Eclipse IDE的工作空间配置文件,`.classpath`定义了项目的类路径,`.project`包含了项目设置。`bin`...

    自己写的Java NIO 同步不阻塞IO操作

    描述中提到的"用nio想的一个不阻塞NIOSocket例子"可能是一个Java NIO的Socket通信示例,利用NIO的Channel和Selector来实现客户端和服务器之间的非阻塞通信。通常,NIO中的SocketChannel用于网络通信,Selector用于...

    JAVA-NIO-DEMO

    本示例"JAVA-NIO-DEMO"提供了关于Java NIO的实际应用,通过Anontion(注解)、Applet(小程序)和NIO的Demo,帮助开发者更深入地理解和掌握这些概念。 首先,让我们深入了解Java NIO。NIO的核心组件包括: 1. **...

Global site tag (gtag.js) - Google Analytics