接着说socket,一般在socket的发送过程中,都会对socket发送的字符串进行一些简单的压缩加密,比如有下面这样的压缩加密方法:
因为这段代码是客户提供的,所以在这里只提供接口,没有提供实现代码,当然,实现代码很简单的,有关于压缩的地方可以参考java.util.zip来进行处理。所谓的加密就更是比较扯淡的了,这个不深入了,这里还是主要说socket。
因为有了上面的压缩加密方法,所以在发送socket和接收socket的时候都要进行处理,以便保证socket通讯中的字符串安全。
这里如果还应用诸如
此类的方式来处理流的话就会出现若干问题,这个问题曾经困扰我很长时间,当时,我试图将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到合肥的票,于是,星巴克咖啡店,等车中…… 祝大家新年快乐,外地的兄弟姐妹们回家过年了。
原文链接:https://www.cnblogs.com/hanbin0/archive/2012/01/15/2322919.html
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/33373