接著說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轉換成字節數組進行解壓縮處理,但是結果很讓人鬱悶。有興趣的可以試試,隨便給裡面來點什麼東西試試。www.aiwalls.com
還記得那次是在財政局進行系統聯調的,由於我是個新人,經驗不足,很多問題都沒有考慮到位,所以,出現瞭我在聯調的時候進行的基本是單元測試的情況;
一個功能一個功能,代碼都得現場寫,比較考驗人,連著內網還不能上網,於是,翻出瞭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到合肥的票,於是,星巴克咖啡店,等車中…… 祝大傢新年快樂,外地的兄弟姐妹們回傢過年瞭。
從來沒有什麼能夠阻擋我前進的步伐,今天沒有,明天也不會有。
摘自 Icer's Cpu