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

前面写了个传输的原型,如今应该写一下消息的编解码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

 

Java代码    收藏代码
  1. package demo;  
  2.   
  3. import java.io.ByteArrayInputStream;  
  4. import java.io.ByteArrayOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.ObjectInputStream;  
  7. import java.io.ObjectOutputStream;  
  8.   
  9. public class Coder {  
  10.   
  11.     public static byte[] encode(Object obj) throws IOException {  
  12.         ByteArrayOutputStream bis = null;  
  13.         ObjectOutputStream os = null;  
  14.         try {  
  15.             bis = new ByteArrayOutputStream(1024);  
  16.             os = new ObjectOutputStream(bis);  
  17.             os.writeObject(obj);  
  18.         } catch (Exception e) {  
  19.             e.printStackTrace();  
  20.         } finally {  
  21.             if (bis != null)  
  22.                 bis.close();  
  23.             if (os != null)  
  24.                 os.close();  
  25.         }  
  26.         return bis.toByteArray();  
  27.     }  
  28.   
  29.     public static Object decode(byte[] src) throws IOException,  
  30.             ClassNotFoundException {  
  31.         ObjectInputStream ois = null;  
  32.         ByteArrayInputStream bos = null;  
  33.         try {  
  34.             bos = new ByteArrayInputStream(src);  
  35.             ois = new ObjectInputStream(bos);  
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.         } finally {  
  39.             if (bos != null)  
  40.                 bos.close();  
  41.             if (ois != null)  
  42.                 ois.close();  
  43.         }  
  44.         return ois.readObject();  
  45.     }  
  46.   
  47. }  
相关文章
相关标签/搜索