`

Java NIO 简单事件响应实现

    博客分类:
  • jdk
阅读更多

com.nio.Server

package com.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
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 Server {
	private Selector selector = null;
	
	public Server() throws IOException{
		// register the server
		ServerSocketChannel ssc = ServerSocketChannel.open(); 
		ssc.configureBlocking(false);
		int port = 8080;
		InetSocketAddress endpoint = new InetSocketAddress(port );
		ssc.socket().bind(endpoint);
		selector = Selector.open();
		ssc.register(selector, SelectionKey.OP_ACCEPT);
	}
	
	public void start() throws IOException{
		while(true){
			int num = selector.select();
			
			if(num>0){
				Set<SelectionKey> selectionKeySet = selector.selectedKeys();
				Iterator<SelectionKey> iterator = selectionKeySet.iterator();
				while(iterator.hasNext()){
					SelectionKey key = iterator.next();
					iterator.remove();// must remove it
					
					if (key.isAcceptable()) {
						ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
						SocketChannel sc = serverSocketChannel.accept();
						sc.configureBlocking(false);
						sc.register(selector, SelectionKey.OP_READ);
						
					}else if (key.isReadable()) {
						System.out.println("do read ...");
						SocketChannel sc = (SocketChannel) key.channel();
						sc.register(selector, SelectionKey.OP_WRITE);
						
					}else if (key.isWritable()) {
						System.out.println("do write ...");
						SocketChannel sc = (SocketChannel) key.channel();
						sc.close();
						key.cancel();
					}
				}
			}
		}
	}
	
	
	public static void main(String[] args) throws Exception {
		new Server().start();
	}

}

com.nio.Client

package com.nio;

import java.io.IOException;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws IOException{
		System.out.println("client start ... ");
		
		Socket socket = new Socket("localhost",8080);
		
		socket.close();
		
		System.out.println("client end ... ");
	}
}

 

Note:

1. 在使用Iterator迭代SelectionKey的后,必须调用Iterator.remove(). 因为select()只会向selector所关联的键集合中添加元素,如果不移除每个处理过的键,它就会在下次select()方法时仍然保留在集合中。

2. 不要轻易使用SelectionKey.cancel(). cancel 会终止selector 和 key关联的Channel的联系。

 

分享到:
评论

相关推荐

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

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

    基于java NIO的socket通信demo

    java NIO 创建的服务端,能够异步响应客户端的请求,客户端采用nio异步请求服务端,通信之间的乱码使用charset解决

    Java+NIO+(中文版).pdf

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

    Java NIO 高性能编程

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

    JAVA IO-NIO 详解

    在Java中,IO(输入/输出)是程序与外部世界进行交互的重要桥梁,而NIO(非阻塞IO)则是Java IO的一个重要扩展,它提供了更为高效、灵活的数据处理方式。 传统的Java IO是阻塞式的,即当程序进行读写操作时,如果...

    基于HTTP、NIO、多线程实现浏览器高并发非阻塞访问服务器文件

    实现功能:基于HTTP协议,解析请求和拼接响应,基于NIO的非阻塞,线程池,文件传输。代码有详细注释和清晰的框架。 程序入口是: /HttpServerReactor/src/com/StartServer.Java 访问1,浏览:...

    [www.java1234.com]Java+NIO+中文版

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

    Java + NIO

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

    基于javatcpsocket通信的拆包和装包源码-DistributedSystemUsingJavaNIO:手把手教你使用JavaNIO构

    JavaNIO网上已有许多不错的文章和教程供开发者学习,如,等等,详细内容本文不再累述,这里只简要总结一下。 普通IO,也叫BIO、Blocking IO,数据在客户和服务器之间交换是阻塞式的,数据通过TC

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    java开源包4

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    Java-programming-methodology-Rxjava-articles:Java编程方法论响应式Rxjava与代码设计实战一书

    : list PL95Ey4rht7980EH8yr7SLBvj9XSE1ggdyJava编程方法论-响应式篇-Reactor-Netty相关博文: : 视频分享: B站: : 油管: : 6qLh2L75KdM list PL95Ey4rht79-ISlb_Yr9ToaEI0K8ARmH6Java编程方法论-JDK篇之NIO分享...

    java开源包3

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    Java-programming-methodology-Reactor-articles:Java编程方法论响应式之Spring Reactor篇

    Java编程方法论-响应式篇-Reactor分享视频已完结B站: : 油管: : list PL95Ey4rht7980EH8yr7SLBvj9XSE1ggdyJava编程方法论-响应式篇-Reactor-Netty相关博文: : 视频分享: B站: : 油管: : 6qLh2L75KdM list PL95...

    java开源包101

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包11

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包6

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包9

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包8

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

Global site tag (gtag.js) - Google Analytics