再说socket
接着说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到合肥的票,于是,星巴克咖啡店,等车中…… 祝大家新年快乐,外地的兄弟姐妹们回家过年了。

浙公网安备 33010602011771号