接着說socket,一般在socket的發送過程中,都會對socket發送的字符串進行一些簡單的壓縮加密,比如有下面這樣的壓縮加密方法:
- package com.huateng.zip;
- /**
- * 壓縮加密和解密解壓縮方法接口
- * @author Icer
- *
- */
- public interface IDealZipData {
- /**
- * 對要發送的字符串進行壓縮加密
- * @param str 要發送的字符串
- * @return 字節數組
- */
- public byte[] getZipByte(String str);
- /**
- * 對接收到的字節數組進行解密解壓縮處理
- * @param mMessage 接收到的字節數組
- * @return 字符串
- */
- public String decode(byte[] mMessage); }
因爲這段代碼是客戶提供的,所以在這裏只提供接口,沒有提供實現代碼,當然,實現代碼很簡單的,有關於壓縮的地方可以參考java.util.zip來進行處理。所謂的加密就更是比較扯淡的了,這個不深入了,這裏還是主要說socket。
因爲有了上面的壓縮加密方法,所以在發送socket和接收socket的時候都要進行處理,以便保證socket通訊中的字符串安全。
這裏如果還應用諸如
- br = new BufferedReader(new InputStreamReader(s.getInputStream()));
- pw = new PrintWriter(s.getOutputStream(),true);
此類的方式來處理流的話就會出現若干問題,這個問題曾經困擾我很長時間,當時,我試圖將readLine()出來的String轉換成字節數組進行解壓縮處理,但是結果很讓人鬱悶。有興趣的可以試試,隨便給裏面來點什麼東西試試。
還記得那次是在財政局進行系統聯調的,由於我是個新人,經驗不足,很多問題都沒有考慮到位,所以,出現了我在聯調的時候進行的基本是單元測試的情況;
一個功能一個功能,代碼都得現場寫,比較考驗人,連着內網還不能上網,於是,翻出了Java API,翻了翻,最後嘗試到了DataInputStream這個東西,
從那天開始,我就喜歡上了這個傢伙(當然,可能是因爲經驗或者其他原因,我以前真的沒用過這個東西,所以,大家見笑了)
下面是我的客戶端代碼(其實,就只是改了一點點細節,大的流程還是一樣的)。
- public static final int BUF_SIZE = 1024;
- /**
- * <p>description</p>發送xml流並接收服務器返回值
- * @param xmlStr
- * @param ip
- * @param port
- * @return 服務器處理完畢返回的xml報文流
- */
- public static String do_xml(String xmlStr,String ip,int port){
- DealZipData dzd = new DealZipData();
- String result = "";
- byte[] buf = new byte[1024*1024];
- try{
- Socket s = new Socket(ip,port);
- OutputStream os = s.getOutputStream();
- s.setSoTimeout(120000);
- System.out.println("超時時間爲:"+s.getSoTimeout()); //
- BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
- BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
- DataInputStream dis = new DataInputStream(s.getInputStream());
- System.out.println("發送的字符串" + xmlStr);
- System.out.println("發送的字節" + dzd.getZipByte(xmlStr));
- os.write(dzd.getZipByte(xmlStr));
- StringBuffer sb = new StringBuffer();
- dis.read(buf,0,buf.length);
- System.out.println("收到的字節"+buf);
- result = dzd.decode(buf);
- }catch(SocketTimeoutException ste){ //
- ste.printStackTrace();
- System.out.println("連接超時,請檢查網絡重新嘗試!");
- }catch(Exception e){
- e.printStackTrace();
- System.out.println("鏈接出錯");
- }
- return result;
- }
服務器端的代碼和客戶端的對阿勒應,我不知道財政局那邊的服務器端怎麼實現的,但是我自己寫的那個會拋異常,客戶端完好,查了些資料,據說是java 壓縮時候的一個bug,有機會了放上來再看了。
=================車站等車================
悲催的今天,買了合肥到西安的票票,到了南京南,只剩下一張18:00到合肥的票,於是,星巴克咖啡店,等車中…… 祝大家新年快樂,外地的兄弟姐妹們回家過年了。