`
pluto418
  • 浏览: 169506 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

NIO基本(2)

    博客分类:
  • J2SE
阅读更多
Selector(异步IO) TCP/IP

异步IO是一种没有阻塞的读写数据的方法,通过在Channel上注册Selector 的各种事件的地方,
当那些事件发生时,这个对象告诉您所发生的事件。
ServerSocketChannel,SocketChannel处理TCP/IP协议
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;


public class SocketChannelServer {
	private int PORT = 1234;
	public ByteBuffer buffer = ByteBuffer.allocate(1024);

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

	public void go() throws IOException {
		Selector selector = getSelector(PORT);
		//第四步:内部处理
		while (true) {
			if (selector.select() == 0)
				continue;

			Iterator<SelectionKey> it = selector.selectedKeys().iterator();
			while (it.hasNext()) {
				SelectionKey key = (SelectionKey) it.next();
				//第五步:监听事件并做出处理
				if (key.isAcceptable()) {
					sayWelcome(selector, key);
				}
				if (key.isReadable()) {
					readData(key);
				}
				//第六步:删除处理过的SelectionKey
				it.remove();
			}
		}
	}

	private void readData(SelectionKey key) throws IOException {
		SocketChannel socketChannel = (SocketChannel) key.channel();
		int count;

		buffer.clear();
		while ((count = socketChannel.read(buffer)) > 0) {
			buffer.flip();

			while (buffer.hasRemaining()) {
				socketChannel.write(buffer);
				System.out
						.println("Get info: " + new String(buffer.toString()));
			}
			buffer.clear();
		}
		if (count < 0) {
			socketChannel.close();
		}

	}

	private void sayWelcome(Selector selector, SelectionKey key)
			throws IOException {
		ServerSocketChannel server = (ServerSocketChannel) key.channel();
		SocketChannel channel = server.accept();
		channel.configureBlocking(false);
		channel.register(selector, SelectionKey.OP_READ);

		System.out.println("Get connection from: "
				+ channel.socket().getRemoteSocketAddress());

		buffer.clear();
		buffer.put("Hi Welcome!\r\n".getBytes());
		buffer.flip();

		channel.write(buffer);
	}

	private Selector getSelector(int port) throws IOException {
		//第一步:创建一个Selector
		Selector selector = Selector.open();
		
		//第二步:打开一个远程连接
		ServerSocketChannel serverChannel = ServerSocketChannel.open();
		ServerSocket serverSocket = serverChannel.socket();
		serverSocket.bind(new InetSocketAddress(PORT));
		serverChannel.configureBlocking(false);
		
		//第三步:选择键,注册
		//SelectionKey中共定义了四种事件,
		//OP_ACCEPT(socket accept)、OP_CONNECT(socket connect)、OP_READ(read)、OP_WRITE(write)
		serverChannel.register(selector, SelectionKey.OP_ACCEPT);

		return selector;
	}

}



测试: cmd telnet 127.0.0.1 1234
分享到:
评论

相关推荐

    Java IO, NIO and NIO.2

    Java IO、NIO以及NIO.2是Java中用于处理输入/输出操作的三种主要机制。本书《Java IO, NIO and NIO.2》旨在深入浅出地介绍这些机制,同时书中内容均为英文。接下来将详细介绍这些知识点。 **Java IO** Java IO是...

    Java NIO Socket基本

    2. **缓冲区(Buffer)**:NIO的核心是缓冲区,它提供了一种存储和操作数据的高效方式。缓冲区类型包括ByteBuffer、CharBuffer、IntBuffer、DoubleBuffer等,它们都继承自`java.nio.Buffer`。 3. **选择器...

    基于nio实现的多文件上传源码

    首先,理解NIO的基本概念是必要的。NIO中的“非阻塞”意味着当数据不可用时,读写操作不会被挂起,而是立即返回,这极大地提高了程序的效率。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器...

    Pro Java 7 NIO2

    ### Pro Java 7 NIO2:深入理解Path类与文件系统操作 #### 一、引言 《Pro Java 7 NIO2》是一本专注于Java 7中的新I/O(NIO.2)特性的书籍,它介绍了如何利用Java 7的新特性来处理文件和网络操作。本书的核心在于...

    nio demo for nio学习笔记(体系结构以及模块介绍)

    在学习NIO时,首先需要理解Channel、Buffer、Selector的基本概念和使用方法,然后通过实例来熟悉它们的交互过程。例如,可以通过创建一个简单的服务器,使用ServerSocketChannel监听连接,SocketChannel处理客户端...

    java NIO实例

    `NIOServer.java`和`NIOClient.java`这两个文件很可能是用于演示Java NIO服务器端和客户端的基本操作。下面将详细介绍Java NIO的主要组件和工作原理,并结合这两个文件名推测它们可能包含的内容。 1. **Selector...

    Java NIO系列教程(一) Java NIO 概述

    2. 将Channel注册到Selector上,并指定感兴趣的事件(如读、写事件等)。 3. 调用Selector的`select()`方法等待事件的发生。如果没有任何事件发生,则此方法会阻塞直到有事件可用。 4. 一旦有事件发生,Selector...

    基于nio的简易聊天室

    缓冲区是NIO中数据存储的主要方式,它们是固定大小的数组,可以用于存储各种基本类型的数据,如字符、字节、整数等。在读写操作中,数据会先被存入缓冲区,然后再从缓冲区传输,这样可以提高效率。在这个聊天室应用...

    JAVA-NIO-DEMO

    2. **缓冲区(Buffers)**:缓冲区是数据操作的基本单位,所有对数据的操作都是通过缓冲区进行的。它们提供了一种在通道与应用程序之间存储数据的方式。 3. **选择器(Selectors)**:选择器允许单个线程监控多个...

    《NIO与Socket编程技术指南》_高洪岩

    2. 文件操作:讲解如何使用NIO进行文件的读写操作,包括文件通道和MappedByteBuffer的使用。 3. 非阻塞I/O:对比NIO和BIO,解释非阻塞I/O的优势,并展示如何在实际项目中应用。 4. 多路复用:详述选择器的工作原理,...

    Java.NIO资源下载资源下载

    本书《Java™ NIO》由 Ron Hitchens 编写,出版社为 O'Reilly,出版于2002年8月,ISBN号为0-596-00288-2,全书共有312页。 ### Java NIO 的优势 本书深入探讨了 Java 1.4 版本中的新 I/O 功能,并通过具体示例展示...

    深入浅出NIO

    《深入浅出NIO》 在Java编程领域,NIO(New Input/Output)是一种用于替代标准IO模型的机制,其核心在于非阻塞的I/O操作和通道(Channel)...通过理解NIO的基本概念和机制,我们可以构建出更高效、可扩展的应用程序。

    nio入门 IBM教材,pdf格式

    ### NIO 入门知识点详解 #### 一、NIO 的引入及其背景 - **NIO 的起源**:NIO(New Input/Output)库是在 JDK 1.4 中引入的,旨在解决传统 Java I/O 操作的局限性和性能瓶颈。 - **改进目标**:NIO 通过提供高速...

    java NIO 写文件

    首先,理解Java NIO的基本概念非常重要。NIO中的“N”代表“非阻塞”,这意味着在进行I/O操作时,程序可以继续执行其他任务,而不是等待数据传输完成。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择...

    NIO实现邮件接收原码

    以上是使用NIO实现邮件接收的基本原理和步骤,实际开发中还需要考虑性能优化、错误处理、多线程等问题。在"assignment2"这个压缩包文件中,可能包含了实现这一功能的具体代码,你可以参考学习,理解其中的逻辑和技巧...

    java nio 实现socket

    #### 三、NIO实现Socket通信的基本流程 基于Java NIO的Socket通信流程大致如下: 1. **创建ServerSocketChannel**:服务器端首先需要创建一个`ServerSocketChannel`,用于监听客户端的连接请求。 2. **创建...

    NIO学习系列:核心概念及基本读写

    本篇内容将深入讲解NIO的核心概念以及基本的读写操作。 ### NIO核心概念 1. **通道(Channel)**:通道是NIO中的关键组件,它连接到I/O设备(如文件、网络套接字等)。通道可以读取或写入数据,且是双向的。例如,...

Global site tag (gtag.js) - Google Analytics