`
pluto418
  • 浏览: 166446 次
  • 性别: 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
分享到:
评论

相关推荐

    NIO2基础介绍

    主要是一些关于NIO2的基本操作和内容,内容是网上下载的收集的,适合没有使用过JDK7以上版本或没有使用过新的文件操作的规范的新手。

    Java NIO Socket基本

    NULL 博文链接:https://b-l-east.iteye.com/blog/1254693

    nio入门 IBM教材,pdf格式

    为了最大程度地从这里的讨论中获益,您应该理解基本的 Java 编程概念,如类、继承和使用包。多少熟悉一些原来的 I/O 库(来自 java.io.* 包)也会有所帮助。 虽然本教程要求掌握 Java 语言的工作词汇和概念,但是不...

    httpcore-nio-4.3.jar包

    用Java实现非阻塞通信 ,用ServerSocket和Socket来编写服务器程序和客户程序,是Java网络编程的最基本的方式。 httpcore-nio-4.3.jar包

    Java NIO原理和使用

    本文主要简单介绍NIO的基本原理,在下一篇文章中,将结合Reactor模式和著名线程大师Doug Lea的一篇文章深入讨论。 NIO主要原理和适用。 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的...

    NIO-实践-多线程实例

    NIO用于高性能Socket编程由来已久,网络也有较为丰富的原理和源代码。我这里主要介绍几点经验总结: ...本文粘贴多线程在NIO环境下的基本运用示例代码,同时演示了一个线程如何对多个连接进行读写的操作。

    java网络编程NIO视频教程

    01-Java NIO-课程简介.mp4 02-Java NIO-概述.mp4 03-Java NIO-Channel-概述.mp4 ...13-Java NIO-Buffer-基本使用.mp4 14-Java NIO-Buffer-三个属性和类型.mp4 15-Java NIO-Buffer-分配和读写数据.mp4

    java nio ppt

    java nio 相关 ppt,介绍了 java nio 的基本概念以及和其他 io 的区别

    Java NIO实战开发多人聊天室

    13-Java NIO-Buffer-基本使用.mp4 14-Java NIO-Buffer-三个属性和类型.mp4 17-Java NIO-Buffer-缓冲区分片.mp4 18-Java NIO-Buffer-只读缓冲区.mp4 19-Java NIO-Buffer-直接缓冲区.mp4 21-Java NIO-Selector-概述....

    nio_proxy:基本的 nio 代理

    nio_proxy 基本的 nio 代理

    Java NIO核心概念总结篇

    这是学习Java NIO过程中总结的核心概念,里面包含了基本的知识点,详细知识点也可以查看我的博客:pcwl_java里的Java NIO篇

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

    NULL 博文链接:https://zhangshixi.iteye.com/blog/679959

    javaNIO学习笔记

    java NIO的基本知识点学习笔记,不包含具体代码

    nio.rar_FastCopyFile.java_NIO_UseFloatBuffer.java_java nio_文件锁

    Java NIO 源码适合初学者,里面包括通道和Buffer的基本适用,以及文件锁,和内存文件映射等等

    复习 J2SE基本内容 IO NIO AIO 的区别

    IO 是面向流的,NIO 是面向缓冲区的 IO 流是阻塞的,NIO 流是不阻塞的 IO 没有选择器,NIO 有选择器     从编程模式上来看AIO相对于NIO的区别在于,NIO需要使用者线程不停的轮询IO对象,来确定是否有数据准备好...

    JAVA Nio 学习探究

    包含NIO核心概念、基本文件读写、缓冲区内部实现机制、异步IO、缓冲区更多特性探究、文件锁与字符集

    javasnmp源码-nio-learn:JavaNIO使用示例,NIO的使用,TCP,UDP的简单示例

    java snmp 源码 Java NIO java nio 简介 Java NIO(New IO)是用于Java(来自Java ...NIO提供了与原来IO ...NIO支持面向缓冲区的,基于通道的IO操作。...NIO将以更加高效的方式进行文件的读写操作。...Buffer的基本使用 通过allo

    nio-template:使用matrix-nio在python中创建矩阵机器人的模板

    其中包括详细的文档以及有关基本机器人构建的分步指南。 功能包括对以下各项的现成支持: Bot命令 SQLite3和Postgres数据库后端 配置文件 多级日志记录 码头工人 参加端到端加密房间 使用nio-template的项目 一个...

    juc_nio_linux.rar

    java.util.concurrent、linux基本操作、NIO(同步、非阻塞)-Channel(通道)、Buffer(缓冲区)、Selector(选择器)

    从NIO到Netty,编程实战出租车905协议-08172347.pdf

    第3章,结合905.4-2014协议的基本内容,动手实现NIO长连接服务端的实现,以及协议内容的设计和实现思路; 第4章,实现长连接客户端,以及采用多线程技术进行系统性能测试; 第5章,介绍Netty相关基础知识,并使用...

Global site tag (gtag.js) - Google Analytics