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

使用NIO处理对象数据

 
阅读更多
  JavaSE中基于Socket的网络通信是阻塞式的,当程序执行输入输出操作后,在这些操作返回之前会一直阻塞该线程,使得服务器要为每一个客户端提供线程进行数据处理,这种处理不适合处理数量多的客户端,jdk1.4后Java引入了nio.
  在进行网络编程时,使用SocketChannel大大减轻了服务器的负担,在此贴上如何讲一个对象装入ByteBuffer的:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.ByteBuffer;

public class BStream {

	public static ByteBuffer toByteBuffer(Object object) {
		ByteArrayOutputStream bio = new ByteArrayOutputStream();
		ObjectOutputStream oos = null;
		ByteBuffer outBuf = null;
		try {
			//包装字节流
			oos = new ObjectOutputStream(bio);
			//将对象写入字节流
			oos.writeObject(object);
			//得到对象字节
			byte[] ba = bio.toByteArray();
			//得到对象字节的长度
			int len = ba.length;
			//字节缓冲区的大小为INT + 对象字节的长度
			outBuf = ByteBuffer.allocate((Integer.SIZE >> 3) + len);
			//压入数据:数据长度
			outBuf.putInt(len);
			//压入数据:对象数据
			outBuf.put(ba);
			//归位
			outBuf.flip();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (bio != null)
					bio.close();
				if (oos != null)
					oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return outBuf;
	}

	public static Object toObject(byte[] buff) {
		ByteArrayInputStream bis = new ByteArrayInputStream(buff);
		ObjectInputStream ois = null;
		try {
			//包装字节数组流
			ois = new ObjectInputStream(bis);
		} catch (IOException e) {
			e.printStackTrace();
		}

		Object object = null;
		try {
			//读入对象
			object = ois.readObject();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				if (bis != null)
					bis.close();
				if (ois != null)
					ois.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return object;
	}
}


数据包解析(部分代码):
System.out.println("client message");
						//获取客户端通信的SocketChannel
						SocketChannel sc = (SocketChannel) sk.channel();
//						new ServiceThread(sc).start();
						
						byte[] data = null;
						try {
							ByteBuffer lenbuff = ByteBuffer.allocate(4);
							//读入对象数据的大小
							sc.read(lenbuff);
							lenbuff.flip();
							int len = lenbuff.getInt();
							if(len == 0) {
								return;
							}
							//分配ByteBuffer的大小
							ByteBuffer buff = ByteBuffer.allocate(len);
							//一次性读取所有数据
							sc.read(buff);
							buff.flip();
							data = buff.array();
							sk.interestOps(SelectionKey.OP_READ);
						} catch (IOException e) {
							if(sk.channel() != null) {
								sk.channel().close();
							}
//							e.printStackTrace();
						}
						//转成请求的对象
						Request request = (Request) BStream.toObject(data);
						String action = request.getAction();
分享到:
评论

相关推荐

    基于java NIO的简单聊天软件示例

    NIO是一种基于通道和缓冲区的I/O方式,它可以使用Native函数库直接分配堆外内存(区别于JVM的运行时数据区),然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的直接引用进行操作。这样能在一些...

    Java性能优化之使用NIO提升性能(Buffer和Channel)

    这种基于流的实现以字节为单位处理数据,并且非常容易建立各种过滤器。NIO是NewI/O的简称,具有以下特性:为所有的原始类型提供(Buffer)缓存支持;使用java.nio.charset.Charset作为字符集编码解码解决方案;增加...

    java nio基础使用示例

    传统的io技术为阻塞的,java新nio是非阻塞的,注册一个op_read事件,注册到selector对象上,当有数据到来时候,selector回通知之前注册事件的对象,进行read处理,看面我看看它是如何使用的

    Java NIO 聊天室 JSwing

    * 采用轮询的方式监听selector上是否有需要处理的事件,如果有,则进行处理 * @throws IOException * @throws InterruptedException */ @SuppressWarnings("unchecked") public void listen() throws ...

    BIO,NIO,AIO,Netty面试题 35道.pdf

    在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:标准输入输出,文件的操作,网络上的数据传输流,字符串流,对象流等等等。 BIO:同步并阻塞,服务器实现一个连接一个线程,即客户端有连接请求时...

    core-nio:nio底层实现原理(另外还有aio的功能)

    core-niojava nio 客户端和服务端交互实现主要通过长连接的方式进行数据交换,采用多路复用技术,同步非阻塞模式。主要有以下几个概念Channel(渠道,类似于高速公路可以处理很多线程io);Selector(选择器,可以...

    基础深化和提高-IO流技术学习大全

    另外,Java还提供了一些高级的流类,如缓冲流、对象流、数据流等,它们在底层字节流和字符流的基础上提供了更多的功能和便利。 除了基本的文件和网络I/O之外,Java的NIO(New I/O)技术也是I/O流领域的重要发展。...

    BAT面试真题最新(涵盖全方面)

    java NIO的⼯工作原理 ...NIO的处理理效率很快。 创建线程有⼏几种不不同的⽅方式?你喜欢哪⼀一种?为什什么? 继承Thread类 实现Runnable接⼝口 应⽤用程序可以使⽤用Executor框架来创建线程池

    基础深化和提高-网络编程

    Java网络编程是指使用Java编程语言进行网络通信和相关操作的技术。通过Java的网络编程能力,开发人员可以创建客户端-服务器应用程序、实现数据传输、远程调用等功能。 Java的网络编程通常涉及以下几个方面: ...

    疯狂JAVA讲义

    6.2 处理对象 170 6.2.1 打印对象和toString方法 170 6.2.2 ==和equals比较运算符 172 6.3 类成员 175 6.3.1 理解类成员 175 6.3.2 单例(Singleton)类 176 6.4 final修饰符 177 6.4.1 final变量 177 6.4.2...

    JAVA_API1.6文档(中文)

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    1_6_zh_CN.CHM

    java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的...

    Java 基础核心总结 +经典算法大全.rar

    节点流和处理流 Java IO 的核心类 File Java IO 流对象 字节流对象InputStream OutputStream 字符流对象Reader Writer 字节流与字符流的转换新潮的 NIO 缓冲区(Buffer)通道(Channel) 示例:文件拷贝案例 BIO 和 NIO ...

    JDK_API_1_6_zh_CN_downcc.com.zip 良心一级分

    java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义了用于多路复用的、非阻塞 I/O 操作的...

    java jdk-api-1.6 中文 chmd

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    Java SE实践教程 源代码 下载

    第2章 对象无处不在——面向对象的基本概念 37 2.1 讲解 38 2.1.1 什么是面向对象 38 2.1.2 面向对象的基本概念 38 2.1.3 Java对面向对象的支持 41 2.2 练习 42 2.2.1 JavaBeans技术开发可重用组件 42 2.2.2 ...

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

    得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥验证签名结果,使用公钥初始化签名对象,用于...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    第2章 对象无处不在——面向对象的基本概念 37 2.1 讲解 38 2.1.1 什么是面向对象 38 2.1.2 面向对象的基本概念 38 2.1.3 Java对面向对象的支持 41 2.2 练习 42 2.2.1 JavaBeans技术开发可重用组件 42 2.2.2 ...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    第2章 对象无处不在——面向对象的基本概念 37 2.1 讲解 38 2.1.1 什么是面向对象 38 2.1.2 面向对象的基本概念 38 2.1.3 Java对面向对象的支持 41 2.2 练习 42 2.2.1 JavaBeans技术开发可重用组件 42 2.2.2 ...

    Java基础知识点总结.docx

    十六、 IO流:用于处理设备上数据 ★★★★★ 94 IO流的概念 95 字符流与字节流 98 流对象 101 File类 102 Java.util.Properties 103 介绍IO包中扩展功能的流对象 103 十七、 网络编程 110 网络基础之网络协议篇 111...

Global site tag (gtag.js) - Google Analytics