`
kyo19
  • 浏览: 73449 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java中Socket实现消息传输(序列化原型)

    博客分类:
  • java
阅读更多

前面写了个传输的原型,现在应该写一下消息的编解码

其实消息的编解码很简单,Socket一般用来传输byte[] ,只要把一个Message的JavaBean对像转成码流,再将其从码流转回成原来的对像就可以了,在这里我们有几种实现的方法

1.写一些类型转换的类,比如int to bytes , longToBytes , StringToBytes ..... 再对每个类进行转换就可以了,这样的好处就是速度会比较快,但是代码要写很多,每个类都需要为他写一个定制的转换的encode与decode,其中可能有人要问为什么String还要写一个toBytes的方法呢? 其实是因为我们要将一个JavaBean转成一个码流,我们并不知道String是在这个码流的什么位置,就算知道位置也不能确定他的长度,因为他是个变长的,所以我们会在String.toBytes后再在前面加一段四个字节的Int型的length。

2.通过反射将类转换成码流,这个方法可以做到通用,但是性能上没有保证。

3.直接序列化与反序列化

 

其中2与3来做的话开始我准备用2,性能也要比序列化快一倍以上,可以在类不断的变的复杂时性能也在成倍的减少,最后竟然还不如序列化了所以2号方法就不再采用直接用序列化的方法。

 

简单的代码在下面,没有作过多的处理,以后有机会再完善吧,其实这个方法在commons-lang包中也有可以查看他的原码

 

package demo;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Coder {

	public static byte[] encode(Object obj) throws IOException {
		ByteArrayOutputStream bis = null;
		ObjectOutputStream os = null;
		try {
			bis = new ByteArrayOutputStream(1024);
			os = new ObjectOutputStream(bis);
			os.writeObject(obj);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (bis != null)
				bis.close();
			if (os != null)
				os.close();
		}
		return bis.toByteArray();
	}

	public static Object decode(byte[] src) throws IOException,
			ClassNotFoundException {
		ObjectInputStream ois = null;
		ByteArrayInputStream bos = null;
		try {
			bos = new ByteArrayInputStream(src);
			ois = new ObjectInputStream(bos);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (bos != null)
				bos.close();
			if (ois != null)
				ois.close();
		}
		return ois.readObject();
	}

}

 

分享到:
评论

相关推荐

    java编写的GUI简单socket聊天源码小程序

    Java编写的GUI简单Socket聊天源码小程序是一种基于Java语言实现的图形用户界面(GUI)通信应用,它利用了Socket编程模型来实现客户端与服务器端之间的实时通讯。在本程序中,用户可以通过友好的图形界面与远程对端...

    java即时通讯源码

    Java的`ObjectOutputStream`和`ObjectInputStream`可以实现对象的序列化和反序列化,使得消息能在网络间传输。 4. **协议设计**:即时通讯系统需要定义一套消息传递协议,包括消息的结构、编码方式等。这通常涉及到...

    JAVA网络通信系统的研究与开发(论文+源代码+开题报告).rar

    Java提供了一种标准的序列化机制,通过实现Serializable接口,对象就可以被序列化。同时,JSON和XML等数据格式也可以用来在客户端和服务器之间交换结构化的数据,Java有对应的库如Jackson和JAXB支持这些数据格式的...

    java课程设计J-QQ

    4. **数据序列化与反序列化**:在客户端和服务端之间传输的数据通常需要进行序列化,以便在网络中传输。Java提供了`Serializable`接口来实现对象的序列化,同时你可能需要了解JSON或XML格式进行数据交换。 5. **...

    P2P五子棋游戏Java编写

    数据通常以序列化对象或JSON格式传输,确保两端能正确解析游戏状态。 6. **并发编程**:为了处理不同玩家的输入和保持游戏的实时性,多线程技术必不可少。每个玩家的行动在一个独立的线程中执行,避免了因等待用户...

    360 java 研发笔试题

    Java的输入/输出(IO)和新IO(NIO)系统在处理数据传输方面起着关键作用: 1. 流的概念:字节流、字符流、缓冲流的层次结构。 2. 文件操作:创建、读写、复制文件。 3. NIO的非阻塞I/O、选择器、通道特性。 五、...

    java面试题

    - 序列化与反序列化,以及它们在集合中的应用。 - 集合操作:迭代器、迭代器与foreach的区别、集合的遍历方式。 - CopyOnWriteArrayList与ConcurrentHashMap等并发安全的集合。 3. **多线程**: - 线程的创建:...

    Java 最常见的面试题

    - 序列化:将对象转换为字节流,便于存储和网络传输。 4. **多线程** - 线程的创建:通过Thread类或实现Runnable接口。 - 线程同步:synchronized、volatile、Lock、Condition、Semaphore等工具。 - 线程池:...

    一个简单聊天程序

    总的来说,"一个简单聊天程序"可能涉及到网络编程、GUI设计、多线程、数据序列化等多个Java开发领域的知识点,对于初学者来说是个不错的实践项目,对于有经验的开发者则是一个快速构建原型或学习新概念的平台。

    Android 仿飞鸽传书源码.zip

    同时,可能涉及到消息序列化和反序列化,例如JSON或protobuf。 4. **数据持久化**:在Android中,数据可以存储在SQLite数据库、SharedPreferences或者文件系统中。源码可能包含数据库操作,如创建表、查询、更新和...

    snippets-java

    5. **IO流**:文件读写,字符流与字节流,缓冲流,对象序列化与反序列化等。 6. **多线程**:线程的创建(Thread类与Runnable接口),同步机制(synchronized关键字,Lock接口),线程池(ExecutorService)等。 7...

    iobuilders-poc

    7. **序列化与反序列化**:`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`用于对象的序列化和反序列化,便于数据持久化和网络传输。 8. **文件系统API**:Java 7引入了`java.nio.file`包,提供了更现代...

    Exort:实验性小型MOBA构想

    为了优化网络延迟,可能还需要采用协议缓冲区(Protocol Buffers)等序列化工具进行高效的数据传输。 最后,测试和调试是项目开发的关键环节。JUnit等单元测试框架可以帮助开发者对游戏逻辑进行详尽的测试,找出...

    设计

    4. **序列化与反序列化**:数据在不同平台间传输时,可能需要将对象转换为可传输的格式,如JSON或XML。 5. **异常处理**:确保程序在面对错误或异常情况时能优雅地处理和恢复。 6. **设计模式**:比如工厂模式、单例...

    Python核心编程第二版

     1.3.10 高效的快速原型开发工具   1.3.11 内存管理器   1.3.12 解释性和(字节)编译性   1.4 下载和安装Python   1.5 运行Python   1.5.1 命令行上的交互式解释器   1.5.2 从命令行启动脚本 ...

Global site tag (gtag.js) - Google Analytics