再說socket – JAVA編程語言程序開發技術文章

接著說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 

發佈留言