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

JAVA IO 之NIO

阅读更多

说明:这篇文章的code不是我写的,来自 林昊的分布式Java 基础与应用的示例demo.

 

server端:

 

package mytcpnio;

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.nio.charset.Charset;

public class ServerDemo {
	public static void main(String[] args) throws Exception{
		int port = 11111;
		
		Selector selector=Selector.open();
		ServerSocketChannel ssc=ServerSocketChannel.open();
		
		ServerSocket serverSocket=ssc.socket();
		//绑定监听端口
		serverSocket.bind(new InetSocketAddress(port));
		System.out.println("Server listens on port: "+port);
		
		ssc.configureBlocking(false);
		ssc.register(selector, SelectionKey.OP_ACCEPT);
		
		while(true){
			int keysNum = selector.select(1000);
			if(keysNum>0){
				for(SelectionKey sk : selector.selectedKeys()){
					if(sk.isAcceptable()){
						ServerSocketChannel serverSocketChannel = (ServerSocketChannel)sk.channel();
						SocketChannel sc = serverSocketChannel.accept();
						if(sc == null){
							continue;
						}
						sc.configureBlocking(false);
						sc.register(selector, SelectionKey.OP_READ);
					}
					if(sk.isReadable()){
						ByteBuffer buffer=ByteBuffer.allocate(1024);
						SocketChannel sc=(SocketChannel) sk.channel();
						int readBytes=0;
						String message=null;
						try{
							int ret;
							try{
								while((ret=sc.read(buffer))>0){
									readBytes+=ret;
								}
							}
							catch(Exception e){
								readBytes=0;
								// IGNORE
							}
							finally{
								buffer.flip();
							}
							if(readBytes>0){
								message=Charset.forName("UTF-8").decode(buffer).toString();
								buffer = null;
							}
						}
						finally{
							if(buffer!=null){
								buffer.clear();
							}
						}
						if(readBytes>0){
							System.out.println("Message from client: "+ message);
							if("quit".equalsIgnoreCase(message.trim())){
								sc.close();
								selector.close();
								System.out.println("Server has been shutdown!");
								System.exit(0);
							}
							String outMessage="Server response:"+message;
							//将消息写入通道
							sc.write(Charset.forName("UTF-8").encode(outMessage));
						}
					}
				}
				//清除这次循环的所有selectedKeys
				selector.selectedKeys().clear();
			}
		}
	}
}

分析:这个示例是一个基于tcp的通信demo.server端的大致创建过程如下:建立servesocketchannel,绑定监听端口,向selector注册,而后由selector轮询管理。server端只存在 accpetable和readable两种信道。

 

 

package mytcpnio;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;

public class ClientDemo {

	public static void main(String[] args) throws Exception{
		
		int port=11111;
		
		SocketChannel socketChannal=SocketChannel.open();
		
		socketChannal.configureBlocking(false);
		SocketAddress target=new InetSocketAddress("127.0.0.1",port);
		socketChannal.connect(target);
		Selector selector=Selector.open();
		socketChannal.register(selector, SelectionKey.OP_CONNECT);
		BufferedReader systemIn=new BufferedReader(new InputStreamReader(System.in));
		while(true){
			if(socketChannal.isConnected()){
				String command=systemIn.readLine();
				/**写入消息到通道 
				 * 退出命令  执行过程大致如下   将退出命令写入通道
				 */
				
				socketChannal.write(Charset.forName("UTF-8").encode(command));
				if(command==null || "quit".equalsIgnoreCase(command.trim())){
					systemIn.close();
					socketChannal.close();
					selector.close();
					System.out.println("Client quit!");
					System.exit(0);
				}
			}
			int keysNum=selector.select(1000);
			if(keysNum>0){
				for (SelectionKey sk : selector.selectedKeys()) {
					if(sk.isConnectable()){
						SocketChannel sc=(SocketChannel) sk.channel();
						sc.configureBlocking(false);
						sc.register(selector, SelectionKey.OP_READ);
						sc.finishConnect();
					}
					else if(sk.isReadable()){
						ByteBuffer buffer=ByteBuffer.allocate(1024);
						SocketChannel sc=(SocketChannel) sk.channel();
						int readBytes=0;
						try{
							int ret=0;
							try{
								while((ret=sc.read(buffer))>0){
									readBytes+=ret;
								}
							}
							finally{
								buffer.flip();
							}
							if(readBytes>0){
								System.out.println(Charset.forName("UTF-8").decode(buffer).toString());
								buffer = null;
							}
						}
						finally{
							if(buffer!=null){
								buffer.clear();
							}
						}
					}
				}
				selector.selectedKeys().clear();
			}
		}
	}
}
 

client端的建立过程与server端大致相同,除了需要ip外,就是信道的种类不同,建立之后也是通过轮询来监听,client端只存在connectable和readable的信道。

 

 

分享到:
评论

相关推荐

    Java IO_NIO

    然而,传统的IO模型在处理大量并发连接时表现出效率较低的问题,为了解决这个问题,Java引入了NIO(Non-blocking Input/Output)模型。 **Java IO核心概念** Java IO的核心类包括InputStream、OutputStream、Reader...

    Java IO与NIO:深入理解与实践指南

    Java IO和NIO提供了两种不同的I/O处理方式,各有优势和适用场景。IO适用于简单的I/O操作,而NIO则适合于需要高性能和高并发的应用。了解这两种I/O处理方式的区别和特点,可以帮助开发者根据具体的应用需求选择合适的...

    java学习笔记1(java io/nio)

    java学习笔记1(java io/nio)设计模式

    Java IO与NIO文档

    Java IO与NIO是Java平台中用于处理输入输出操作的核心技术。它们在处理数据传输、文件操作、网络通信等方面起着至关重要的作用。本篇将深入探讨这两个领域,旨在帮助开发者更好地理解和应用这些概念。 首先,Java ...

    Java IO NIO and NIO 2 无水印pdf

    Java IO NIO and NIO 2 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn...

    JAVA IO and NIO

    Java IO (Input/Output) 和 NIO (Non-blocking Input/Output) 是Java平台中用于处理输入和输出操作的重要部分。这两种技术在实现客户端与服务器之间的通信时起着至关重要的作用。下面将详细介绍Java IO和NIO的特点、...

    Java IO NIO and NIO 2 epub

    Java IO NIO and NIO 2 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Java IO,NIO and NIO.2 mobi

    java io nio nio2 java io的百科全书 mobi格式 需要kindle 软件

    java io 与java nio区别

    ### Java IO 与 Java NIO 的区别 在深入探讨Java IO与Java NIO之间的区别之前,我们先简单回顾一下这两种I/O模型的基本概念。 #### 1. Java IO(Blocking IO) Java IO,也称为传统的阻塞式IO或同步阻塞式IO,是...

    java IO、NIO、AIO详解.docx

    Java IO、NIO、AIO 详解 Java IO、NIO、AIO 是 Java 语言中三种不同的输入/输出机制,分别对应着不同的编程模型和设计理念。在高并发环境中,选择合适的输入/输出机制非常重要,本文将对 Java IO、NIO、AIO 进行...

    java IO NIO AIO.xmind

    涉及到java io, nio, aio相关知识点,学习过程中的一些总结,持续更新中,xmind 格式

    JavaIO和NIO练习

    在"JavaIODemo"这个练习中,我们可能会看到以下内容: 1. 流的创建与使用:演示如何创建输入流和输出流对象,例如从文件读取数据并写入到另一个文件。 2. 缓冲技术:使用BufferedReader和BufferedWriter实现高效的...

    SimpleSocketServer:Java IO | NIO样本

    SimpleSocketServer Java IO | NIO样本使用Java IO和NIO设置自己的Socket Server(待办事项) 深入了解Tomcat和Jetty的实现方式(希望如此)

    JAVA IO-NIO 详解

    ### JAVA IO-NIO 详解 #### 一、IO与NIO概述 在Java开发中,输入/输出(IO)操作是程序与外部环境交互的重要环节。通过IO操作,程序可以读取外部数据或向外部环境输出数据。Java的IO体系自Java 1.0以来就一直存在...

    IO和NIO区别

    Java 中的 IO 和 NIO 是两个不同的输入/输出机制,它们之间有许多区别。下面我们将详细讲解 IO 和 NIO 的区别。 1. 数据处理方式 标准 IO 以流的方式处理数据,也就是说数据是以流的形式传输的,而 NIO 则以块的...

    Java IO, NIO and NIO.2(Apress,2015)

    Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...

    Java IO, NIO and NIO.2 原版pdf by Friesen

    not introduced with the other NIO types in Java 1.4 because they depend on the variable arguments capability that was introduced in Java 5.) NIO is missing several features, which were subsequently ...

    基于JAVA IO, NIO, Netty, 多线程并发实战源码.zip

    Java IO、NIO和Netty是Java平台中用于处理输入/输出操作的重要组件,而多线程并发则是提升程序性能和响应能力的关键技术。在这个压缩包"基于JAVA IO, NIO, Netty, 多线程并发实战源码.zip"中,我们可以期待找到一些...

Global site tag (gtag.js) - Google Analytics