前面写了个传输的原型,如今应该写一下消息的编解码javascript
其实消息的编解码很简单,Socket通常用来传输byte[] ,只要把一个Message的JavaBean对像转成码流,再将其从码流转回成原来的对像就能够了,在这里咱们有几种实现的方法java
1.写一些类型转换的类,好比int to bytes , longToBytes , StringToBytes ..... 再对每一个类进行转换就能够了,这样的好处就是速度会比较快,可是代码要写不少,每一个类都须要为他写一个定制的转换的encode与decode,其中可能有人要问为何String还要写一个toBytes的方法呢? 实际上是由于咱们要将一个JavaBean转成一个码流,咱们并不知道String是在这个码流的什么位置,就算知道位置也不能肯定他的长度,由于他是个变长的,因此咱们会在String.toBytes后再在前面加一段四个字节的Int型的length。app
2.经过反射将类转换成码流,这个方法能够作到通用,可是性能上没有保证。性能
3.直接序列化与反序列化spa
其中2与3来作的话开始我准备用2,性能也要比序列化快一倍以上,能够在类不断的变的复杂时性能也在成倍的减小,最后居然还不如序列化了因此2号方法就再也不采用直接用序列化的方法。code
简单的代码在下面,没有做过多的处理,之后有机会再完善吧,其实这个方法在commons-lang包中也有能够查看他的原码blog
- 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();
- }
-
- }