`

JAVA NIO入门实例

    博客分类:
  • IO
 
阅读更多
基本概念:参考http://zhangshixi.iteye.com/blog/679959作者的系列文章即可
NIO因为其高效性,成为了服务端的首选,大大提高了服务端的响应效率。
我自己读完作者的文章,写了一个简单的DEMO
服务端:

package com.liuc.io;

import java.io.IOException;
import java.net.InetSocketAddress;
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.nio.charset.Charset;
import java.util.Iterator;
import java.util.Set;

import org.apache.log4j.Logger;

public class NIOServer extends Thread {
	private Logger log=Logger.getLogger(NIOServer.class);
	private boolean stop=false;
	private String ip="localhost";
	private int port=9999;
	private Selector selector;
	private ByteBuffer buffer=ByteBuffer.allocate(1024);
	private Charset gbkCharset = Charset.forName( "GB2312" );  
	public NIOServer() {
		try {
			selector=Selector.open();
			ServerSocketChannel ssc=ServerSocketChannel.open();
			InetSocketAddress address=new InetSocketAddress(ip, port);
			//ServerSocket绑定IP
			ssc.socket().bind(address);
			//设置为非阻塞模式
			ssc.configureBlocking(false);
			//向选择器注册
			ssc.register(selector,SelectionKey.OP_ACCEPT);	
			System.out.println("Listen to port:"+port);
		} catch (IOException e) {
			log.error(e);
		}
		
	}

	@Override
	public void run() {
		System.out.println("deal with request");
		while(!stop){
				String content="HelloWorld";
				try {
					int numKeys = selector.select();
					Set<SelectionKey> selectionKeys=selector.selectedKeys();
					Iterator<SelectionKey> iterator=selectionKeys.iterator();
					while (iterator.hasNext()) {
						 SelectionKey key = iterator.next();
						 iterator.remove();
						 dealRequest(key,content);
					}
				} catch (IOException e) {
					log.equals(e);
				}
				
		}
	}
	
	private void dealRequest(SelectionKey key,String contentToSend) {
		try {
			 
			 StringBuffer clientContent=new StringBuffer();
			  if(key.isAcceptable()){//测试此键的通道是否已准备好接受新的套接字连接。
				  ServerSocketChannel ssc=(ServerSocketChannel) key.channel();
				  SocketChannel sc=ssc.accept();
				  sc.configureBlocking(false);
				  sc.register(selector, SelectionKey. OP_READ);
			  }else if(key.isReadable()) {//测试此键的通道是否已准备好进行读取。 
				  SocketChannel sc=(SocketChannel) key.channel();
				  while(true){//读取全部数据
					  buffer.clear();
					  int r=sc.read(buffer);
					  buffer.flip();
					  byte[] temp=new byte[r];
					  if (r<=0) {
						break;
					  }
					  clientContent.append(gbkCharset.decode(buffer).toString());
					 
				  }
				  //获取全部的数据
				  String content=clientContent.toString();
				  String[] info=content.split(",");//用户名密码验证
				  System.out.println("客户端的验证请求为:"+content);

					  sc.register(selector, SelectionKey.OP_WRITE);
				  
			  }else if(key.isWritable()){//测试此键的通道是否已准备好进行写入
				System.out.println("要发送的消息为"+contentToSend);
				buffer.clear();
				buffer.put(contentToSend.getBytes());
				buffer.flip();
				SocketChannel sc = (SocketChannel)key.channel();
				sc.write(buffer);
				buffer.flip();
				//发送完信息后关闭连接
				key.cancel();
                sc.close();
			}
			
		} catch (IOException e) {
			System.out.println(e);
			//客户端断开连接,所以从Selector中取消注册 
			key.cancel();
			if(key.channel() != null)
				try {
					key.channel().close();
					log.debug("the client socket is closed!");
					//System.out.println("the client socket is closed!");
				} catch (IOException e1) {
					e1.printStackTrace();
				}
		}
	}
		

	public static void main(String[] args){
		new NIOServer().start();
	}

}

客户端:
package com.liuc.io;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class NIOClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Socket socket=null;
		OutputStream outputStream=null;
		InputStream inputStream=null;
		try {
			socket=new Socket("localhost", 9999);
			outputStream=socket.getOutputStream();
			String sendContent="HelloWorld";
			outputStream.write(sendContent.getBytes());
			outputStream.flush();
			
			
			inputStream=socket.getInputStream();
			byte[] bytes=new byte[1024];
			int n=inputStream.read(bytes);
			System.out.println(new String(bytes));
			
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
					if(inputStream!=null){
						inputStream.close();
					}
					if (outputStream!=null) {
						outputStream.close();
					}
					if (socket!=null) {
						socket.close();
					}
			} catch (IOException e) {
				e.printStackTrace();
			}
			
		}
		

	}

}
分享到:
评论

相关推荐

    java nio 入门

    四、NIO应用实例 1. **文件操作**:使用FileChannel进行文件的读写,例如将一个文件复制到另一个文件。 2. **网络通信**:使用SocketChannel和ServerSocketChannel进行客户端和服务器端的连接与数据传输。 3. **多...

    Java NIO入门

    IBM的NIO入门教程通常会涵盖这些基础概念,并通过实例演示如何使用NIO进行实际的I/O操作。教程可能还会深入讲解NIO的高级特性,如scatter/gather(分散/聚集)读写,以及如何使用`Selector`进行多路复用。通过学习这...

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    [第4节] JavaNIO流-通道1.flv [第5节] Java NIO流-通道2.flv [第6节] Java NIO流-socket通道操作.flv [第7节] Java NIO流-文件通道操作.flv [第8节] Java NIO流-选择器 .flv [第9节] Java NIO流-选择器操作.flv...

    java入门与实例

    "Java入门与实例"针对的是对编程感兴趣的初学者,它提供了通俗易懂的讲解和实践案例,帮助初学者快速掌握Java编程基础。 Java的基础知识点包括: 1. **环境搭建**:首先,学习Java需要安装Java Development Kit ...

    Java入门与实例(初级)

    这个名为“Java入门与实例”的资源包显然是为初级Java开发者设计的,旨在提供基础知识和实践案例,帮助他们快速掌握编程技能。 首先,让我们深入了解Java语言的基础知识。Java是一种面向对象的语言,由Sun ...

    Java基础编程实例

    Java基础编程实例是Java初学者入门的绝佳资源,它涵盖了Java语言的核心概念和技术。这个教程旨在帮助新手理解并掌握Java编程的基本元素,从而能够独立编写简单的程序。以下是一些主要的知识点: 1. **Java环境配置*...

    Java2入门与实例教程

    Java2入门与实例教程是一本面向初学者的编程教材,主要涵盖了Java语言的基础知识和实践应用。这本书旨在帮助读者从零开始,逐步掌握Java编程的基本概念、语法和编程技巧。以下将详细介绍书中可能包含的一些核心知识...

    Java 入门与实例教程(pdg)

    这个Java入门与实例教程将通过丰富的实例和详细的解释,帮助初学者逐步建立起坚实的Java编程基础,为更高级的Java开发打下坚实的基础。通过实践这些实例,你不仅能够掌握理论知识,还能提高实际编程能力,从而在Java...

    Java编程入门学习资料

    12. **IO与NIO**:了解传统的IO模型,以及Java NIO(非阻塞I/O)的优势和使用场景。 13. **多线程**:学习如何创建和管理线程,理解线程同步和互斥的概念,使用synchronized关键字和Lock接口确保线程安全。 14. **...

    java从入门到精通书籍教学用PPT

    本资源“java从入门到精通书籍教学用PPT”是为初学者设计的一套全面的学习材料,旨在帮助读者从零基础快速掌握Java编程的基础知识和实战技能。 在学习Java的过程中,首先会涉及的是基础语法,包括数据类型(如整型...

    初学者必看的JAVA开发入门(源代码)

    IO流和NIO(非阻塞I/O)也是Java开发中不可或缺的部分,用于读写文件、网络通信等。 最后,线程和并发编程在多核处理器时代变得尤为重要。Java提供了丰富的并发工具,如synchronized关键字、Thread类和...

    java从入门到提升

    《Java从入门到提升》是一份综合性的学习资源,涵盖了初学者从接触Java语言到熟练掌握的全过程。这个资料包的出现,无疑是为那些渴望在编程领域深入学习Java的人提供了宝贵的资源。 首先,我们从“Java基础程序”这...

    英文版java7入门经典

    在I/O流方面,Java 7引入了NIO.2(New I/O 2.0),提供了更强大和更灵活的文件操作能力,包括文件路径API、异步文件通道以及文件属性的处理。这些新特性使得开发者可以更高效地处理大量输入输出操作。 除此之外,书...

    NIO与传统IO代码区别实例

    在Java编程领域,IO(Input/Output)和NIO(Non-blocking Input/Output)是两种不同的I/O模型,它们在处理数据输入和输出时有着显著的...希望这个简要的介绍能帮助你入门NIO,并鼓励你进一步探索这个强大的I/O模型。

    Java 7 入门经典源代码和习题解答

    本资源包"Java 7 入门经典源代码和习题解答"是专为初学者设计的,旨在帮助学习者快速掌握Java 7的基础知识。 首先,让我们深入了解Java 7中的关键特性: 1. **自动资源管理(try-with-resources)**:这是一个语法...

    JAVA初学者入门基础文档

    Java初学者入门基础文档是一份全面的教程,旨在帮助新手快速掌握Java编程语言的基本概念和技能。这份资料共分为15个章节,每个章节都深入浅出地讲解了Java编程的关键知识点,并通过实例来加深理解。 第1章:Java...

    Java基础入门教程

    在"Java基础入门教程"中,你将系统学习这些基础知识,并通过实例练习加深理解。"JavaNew1-8.pdf"很可能包含了详细的章节讲解和示例代码,帮助你逐步掌握Java编程。无论是打算开发桌面应用、移动应用还是服务器端应用...

    mina入门实例

    本入门实例将带你了解如何使用Mina进行基本的网络通信。 首先,我们从环境配置开始。这个实例要求使用Maven作为项目构建工具,因此你需要确保已经安装了Maven,并且在项目中设置了正确的`pom.xml`文件。在`pom.xml`...

    JAVA SKD5.0实例宝典.rar

    通过这个实例宝典,开发者将能够深入理解并熟练运用Java SDK 5.0的这些关键特性,提升编程能力和代码质量。同时,由于文档是英文版,对于提高英语阅读能力也有一定帮助,尤其是专业术语的理解。

Global site tag (gtag.js) - Google Analytics