再說socket

接着說socket,一般在socket的發送過程中,都會對socket發送的字符串進行一些簡單的壓縮加密,比如有下面這樣的壓縮加密方法:

  1. package com.huateng.zip;   
  2. /**    
  3. * 壓縮加密和解密解壓縮方法接口    
  4. * @author Icer    
  5. *    
  6. */ 
  7. public interface IDealZipData {       
  8. /**        
  9. * 對要發送的字符串進行壓縮加密        
  10. * @param str 要發送的字符串        
  11. * @return 字節數組        
  12. */      
  13. public  byte[] getZipByte(String str);             
  14. /**        
  15. * 對接收到的字節數組進行解密解壓縮處理        
  16. * @param mMessage 接收到的字節數組        
  17. * @return 字符串        
  18. */      
  19. public String decode(byte[] mMessage); } 

因爲這段代碼是客戶提供的,所以在這裏只提供接口,沒有提供實現代碼,當然,實現代碼很簡單的,有關於壓縮的地方可以參考java.util.zip來進行處理。所謂的加密就更是比較扯淡的了,這個不深入了,這裏還是主要說socket。

因爲有了上面的壓縮加密方法,所以在發送socket和接收socket的時候都要進行處理,以便保證socket通訊中的字符串安全。

這裏如果還應用諸如

  1. br = new BufferedReader(new InputStreamReader(s.getInputStream()));                   
  2. pw = new PrintWriter(s.getOutputStream(),true); 

此類的方式來處理流的話就會出現若干問題,這個問題曾經困擾我很長時間,當時,我試圖將readLine()出來的String轉換成字節數組進行解壓縮處理,但是結果很讓人鬱悶。有興趣的可以試試,隨便給裏面來點什麼東西試試。

還記得那次是在財政局進行系統聯調的,由於我是個新人,經驗不足,很多問題都沒有考慮到位,所以,出現了我在聯調的時候進行的基本是單元測試的情況;

一個功能一個功能,代碼都得現場寫,比較考驗人,連着內網還不能上網,於是,翻出了Java API,翻了翻,最後嘗試到了DataInputStream這個東西,

從那天開始,我就喜歡上了這個傢伙(當然,可能是因爲經驗或者其他原因,我以前真的沒用過這個東西,所以,大家見笑了)

下面是我的客戶端代碼(其實,就只是改了一點點細節,大的流程還是一樣的)。

  1. public static final int BUF_SIZE = 1024;       
  2. /**        
  3. * <p>description</p>發送xml流並接收服務器返回值        
  4. * @param xmlStr        
  5. * @param ip        
  6. * @param port        
  7. * @return 服務器處理完畢返回的xml報文流        
  8. */      
  9. public static String do_xml(String xmlStr,String ip,int port){           
  10. DealZipData dzd = new DealZipData();           
  11. String result = "";           
  12. byte[] buf = new byte[1024*1024];           
  13. try{               
  14. Socket s = new Socket(ip,port);               
  15. OutputStream os = s.getOutputStream();               
  16. s.setSoTimeout(120000);               
  17. System.out.println("超時時間爲:"+s.getSoTimeout()); //            
  18. BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));               
  19. BufferedInputStream bis = new BufferedInputStream(s.getInputStream());               
  20. DataInputStream dis = new DataInputStream(s.getInputStream());                             
  21. System.out.println("發送的字符串" + xmlStr);               
  22. System.out.println("發送的字節" + dzd.getZipByte(xmlStr));               
  23. os.write(dzd.getZipByte(xmlStr));                             
  24. StringBuffer sb = new StringBuffer();               
  25. dis.read(buf,0,buf.length);               
  26. System.out.println("收到的字節"+buf);                         
  27. result = dzd.decode(buf);           
  28. }catch(SocketTimeoutException ste){ //            
  29. ste.printStackTrace();               
  30. System.out.println("連接超時,請檢查網絡重新嘗試!");           
  31. }catch(Exception e){               
  32. e.printStackTrace();               
  33. System.out.println("鏈接出錯");           
  34. }                     
  35. return result;       

服務器端的代碼和客戶端的對阿勒應,我不知道財政局那邊的服務器端怎麼實現的,但是我自己寫的那個會拋異常,客戶端完好,查了些資料,據說是java 壓縮時候的一個bug,有機會了放上來再看了。

=================車站等車================

  悲催的今天,買了合肥到西安的票票,到了南京南,只剩下一張18:00到合肥的票,於是,星巴克咖啡店,等車中…… 祝大家新年快樂,外地的兄弟姐妹們回家過年了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章