`
247687009
  • 浏览: 174506 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA socket编程之NIO技术

    博客分类:
  • JAVA
阅读更多
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。
Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。
Java NIO出现不只是一个技术性能的提高,你会发现网络上到处在介绍它,因为它具有里程碑意义,从JDK1.4开始,Java开始提高性能相关的功能,从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。
简单说:使用java nio开发网络通讯 是比较快速和方面的。因为他可以不用阻塞的方式侦听客户端的连接 ,在java nio中可以使用基于事件的机制进行非阻塞通讯,当有新的事
件进行注册时 我们只需要通过事件侦听机制 获取新的事件
简单的说就是 java nio中里面有一个selector  异步 I/O 中的核心对象名为 Selector。Selector 就是您注册对各种 I/O 事件的兴趣的地方。
下面上代码,注释说明


package nio.socket;

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.util.Iterator;
import java.util.Set;

import org.junit.Test;

public class Server {

	@Test
	public void server() throws IOException {
		//selector就是您注册对各种io事件的兴趣的地方 而且当那些事件发生时 就是这个对象告诉您所发生的事情
		Selector selector = Selector.open();
		//开启一个ServerSocketChannel通道
		ServerSocketChannel ssc = ServerSocketChannel.open();
		//绑定地址和端口
		ssc.bind(new InetSocketAddress("localhost", 8080));
		// 设置为非阻塞式的IO 
		ssc.configureBlocking(false);
		//注册感兴趣的
		ssc.register(selector, SelectionKey.OP_ACCEPT);
		//设置一个缓冲
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		//接收客户端过来的通道
		SocketChannel sc = null;
		while (true) {
			selector.select();  //查询事件,监听一旦有我们注册的感兴趣的事件发生的时候便会激活
			Set<SelectionKey> selectedKeys = selector.selectedKeys(); //获取到触发的事件集合
			SelectionKey key = null;
			Iterator<SelectionKey> iterator = selectedKeys.iterator();
			for (;iterator.hasNext();) {//循环
				key = iterator.next();
				if(key.isAcceptable()){ //表示触发的事件是新连接
					ServerSocketChannel newssc = (ServerSocketChannel) key.channel();
					 sc = newssc.accept(); //获取到客户端过来的通道
					 sc.configureBlocking(false); //设置为非阻塞式IO
					 sc.register(selector, SelectionKey.OP_READ);//注册读取事件
					 iterator.remove(); //事件集合中删除
					 System.out.println("有新的连接");
				}else if(key.isReadable()){ //表示读取事件 在连接时候注册了读取事件 在这里处理
					sc = (SocketChannel) key.channel(); //得到客户端的通道
					while(true){
						buffer.clear(); //如果信息量超过预设的缓存就会便会批量读取 重复使用 这里必须清理一下
						int read = sc.read(buffer);
						if(read == -1 || read == 0)break; //如果读取完了 则退出循环
						if(read > 0){
							byte[] array = buffer.array();
							System.out.println("接受到的数据"+new String(array));
						}
					}
					buffer.clear();
					buffer.put("这是我的测试".getBytes());
					buffer.flip();//flip方法将Buffer从写模式切换到读模式
					sc.write(buffer);
					sc.close();//使用完毕关闭客户端的通道
					System.out.println("操作结束==============");
					iterator.remove();
				}
				
			}
		}

	}

}

分享到:
评论
1 楼 xly1981 2014-06-19  
这会影响我们程序继续做其他事情, ----这句话感觉有误导性,准确的说应该是影响CPU的使用效率,因为read阻塞导致的CPU把资源浪费在了工作线程的上下文切换中;NIO则可以避免大量的工作线程不断的做上下文切换,而只有一个监控线程不断的监控管道,从而减小资源浪费。

相关推荐

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

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

    《NIO与Socket编程技术指南》是一本深入探讨Java NIO(New Input/Output)和Socket编程的专业书籍,由高洪岩撰写。本书主要针对Java开发者,旨在帮助他们理解和掌握这两种在开发网络应用中至关重要的技术。 Java ...

    Java NIO Socket基本

    **Socket编程在NIO中的应用**: 1. **ServerSocketChannel**:用于监听客户端连接,通过调用`ServerSocketChannel.open()`创建,然后绑定到指定的IP和端口,并调用`accept()`方法接收客户端连接。 2. **...

    JAVA Socket编程实现文件上传

    Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信连接的能力。在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库...

    java socket 编程文档

    总结,Java Socket编程是构建网络应用的关键技术。通过理解Socket的工作原理,掌握创建、连接、通信和关闭的基本步骤,以及处理异常和优化性能的方法,开发者可以构建出健壮且高效的网络应用程序。

    java nio 实现socket

    ### Java NIO 实现Socket通信详解 #### 一、NIO与传统IO的区别及优势 在探讨如何使用Java NIO实现Socket通信之前,我们需要先理解NIO(Non-blocking I/O,非阻塞I/O)与传统阻塞I/O之间的区别。 **传统阻塞I/O...

    java socket nio 研究

    Java Socket和NIO(Non-blocking Input/Output,非阻塞I/O)是Java网络编程中的重要组成部分,它们在处理高并发、低延迟的网络服务时展现出强大的能力。本篇文章将深入探讨这两个概念,并通过示例代码`...

    Java源码:Socket编程.rar_java socket _java编程_socket java_socket编程 jav

    本资料包含的"Java源码:Socket编程"是一个示例,旨在帮助开发者理解并掌握Java中的Socket编程技术。 首先,Socket编程涉及的主要类有`ServerSocket`和`Socket`。`ServerSocket`类用于创建服务器端的监听套接字,它...

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

    非常详细地讲解了NIO中的缓冲区、通道、选择器、编码,以及使用Socket技术实现TCP/IP和UDP编程,细化到了演示全部SocketOption的特性,这对理解基于NIO和Socket技术为基础所开发的NIO框架是非常有好处的,本书以案例...

    三步学会Java_Socket编程

    在Java中,Socket编程是实现网络通信的基础,它提供了进程间通信的能力,使得两个相隔万里的计算机可以通过互联网进行数据交换。本篇文章将深入讲解如何通过三步学习Java Socket编程。 **第一步:理解Socket** ...

    JAVA Socket 经典教程

    - **NIO(非阻塞I/O)**:Java NIO库提供了非阻塞的Socket编程模型,适用于高并发场景,如`Selector`和`Channel`。 7. **实践应用** - **聊天应用**:基于Socket的简单聊天室,客户端发送消息到服务器,服务器...

    java Socket 编程源码

    - 使用NIO(非阻塞I/O)可以通过`java.nio`包提高Socket编程的效率,特别是对于高并发场景。 - 使用缓冲区(Buffer)进行数据读写,减少系统调用次数。 7. **SSL/TLS安全通信**: - 对于需要加密和身份验证的...

    Java socket网络编程的基础示例

    在Java中,我们可以使用`java.net.Socket`类和`java.net.ServerSocket`类来实现TCP Socket编程。`ServerSocket`用于监听客户端的连接请求,`Socket`则代表一个客户端连接。以下是一个简单的TCP服务器端和客户端示例...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    标题“nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio”表明这个压缩包包含了一个关于Java NIO的实例,特别是关于NIO套接字(Socket)的编程示例。NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许...

    java的Socket编程

    - NIO(非阻塞I/O)的`java.nio`包提供了更高效的Socket编程模型,适用于高并发场景。 总之,Java的Socket编程提供了强大的能力来构建网络应用程序。通过理解`Socket`和`ServerSocket`类,以及如何使用它们进行...

    java socket Bio Nio example

    Java Socket编程是网络通信的核心部分,它提供了进程间通信(IPC)的能力,使得运行在不同设备上的应用程序可以通过网络互相通信。在Java中,Socket主要分为两种模式:BIO(Blocking I/O)和NIO(Non-blocking I/O)...

    Java Socket编程.pdf

    输入输出流是用于数据读写的接口,是Socket编程中的核心概念之一。 6. 发送和接收数据 数据在发送和接收前需要进行编码和解码。信息编码包括基本整型、字符串和文本、位操作等。组合输入输出流允许同时读写多个...

    JAVA Socket 网络编程教程

    本教程将深入探讨Java Socket编程的基本概念、原理和实践应用。 一、Socket基本概念 Socket,也被称为套接字,是网络通信中的一个重要接口,它为两台计算机提供了一个低级别的、进程到进程的通信机制。在Java中,...

    nio.rar_Java socketA_java nio_java socket a

    在Java Socket编程中,NIO可以提供更高效、更灵活的网络通信方式,尤其适用于高并发的服务器应用。 标题中的“Java socketA_java nio_java socket a”可能是指使用Java NIO实现的Socket通信,这里的"A"可能是表示...

Global site tag (gtag.js) - Google Analytics