前面写了个传输的原型,现在应该写一下消息的编解码
其实消息的编解码很简单,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的`ObjectOutputStream`和`ObjectInputStream`可以实现对象的序列化和反序列化,使得消息能在网络间传输。 4. **协议设计**:即时通讯系统需要定义一套消息传递协议,包括消息的结构、编码方式等。这通常涉及到...
Java提供了一种标准的序列化机制,通过实现Serializable接口,对象就可以被序列化。同时,JSON和XML等数据格式也可以用来在客户端和服务器之间交换结构化的数据,Java有对应的库如Jackson和JAXB支持这些数据格式的...
4. **数据序列化与反序列化**:在客户端和服务端之间传输的数据通常需要进行序列化,以便在网络中传输。Java提供了`Serializable`接口来实现对象的序列化,同时你可能需要了解JSON或XML格式进行数据交换。 5. **...
数据通常以序列化对象或JSON格式传输,确保两端能正确解析游戏状态。 6. **并发编程**:为了处理不同玩家的输入和保持游戏的实时性,多线程技术必不可少。每个玩家的行动在一个独立的线程中执行,避免了因等待用户...
Java的输入/输出(IO)和新IO(NIO)系统在处理数据传输方面起着关键作用: 1. 流的概念:字节流、字符流、缓冲流的层次结构。 2. 文件操作:创建、读写、复制文件。 3. NIO的非阻塞I/O、选择器、通道特性。 五、...
- 序列化与反序列化,以及它们在集合中的应用。 - 集合操作:迭代器、迭代器与foreach的区别、集合的遍历方式。 - CopyOnWriteArrayList与ConcurrentHashMap等并发安全的集合。 3. **多线程**: - 线程的创建:...
- 序列化:将对象转换为字节流,便于存储和网络传输。 4. **多线程** - 线程的创建:通过Thread类或实现Runnable接口。 - 线程同步:synchronized、volatile、Lock、Condition、Semaphore等工具。 - 线程池:...
总的来说,"一个简单聊天程序"可能涉及到网络编程、GUI设计、多线程、数据序列化等多个Java开发领域的知识点,对于初学者来说是个不错的实践项目,对于有经验的开发者则是一个快速构建原型或学习新概念的平台。
同时,可能涉及到消息序列化和反序列化,例如JSON或protobuf。 4. **数据持久化**:在Android中,数据可以存储在SQLite数据库、SharedPreferences或者文件系统中。源码可能包含数据库操作,如创建表、查询、更新和...
5. **IO流**:文件读写,字符流与字节流,缓冲流,对象序列化与反序列化等。 6. **多线程**:线程的创建(Thread类与Runnable接口),同步机制(synchronized关键字,Lock接口),线程池(ExecutorService)等。 7...
7. **序列化与反序列化**:`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`用于对象的序列化和反序列化,便于数据持久化和网络传输。 8. **文件系统API**:Java 7引入了`java.nio.file`包,提供了更现代...
为了优化网络延迟,可能还需要采用协议缓冲区(Protocol Buffers)等序列化工具进行高效的数据传输。 最后,测试和调试是项目开发的关键环节。JUnit等单元测试框架可以帮助开发者对游戏逻辑进行详尽的测试,找出...
4. **序列化与反序列化**:数据在不同平台间传输时,可能需要将对象转换为可传输的格式,如JSON或XML。 5. **异常处理**:确保程序在面对错误或异常情况时能优雅地处理和恢复。 6. **设计模式**:比如工厂模式、单例...
1.3.10 高效的快速原型开发工具 1.3.11 内存管理器 1.3.12 解释性和(字节)编译性 1.4 下载和安装Python 1.5 运行Python 1.5.1 命令行上的交互式解释器 1.5.2 从命令行启动脚本 ...