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. }  
相關文章
相關標籤/搜索