使用JavaSocket编写发送HTTP_POST请求的工具类 (九)

2014-11-24 11:39:21 · 作者: · 浏览: 57
/既然匹配到了Content-Type,那就一定不会匹配到我们想到的\r\n,所以就直接跳到下一次循环中喽..
continue;
}
if(from>0 && to==0 && respBuffer[i]==13 && respBuffer[i+1]==10){
//一定要加to==0限制,因为可能存在Content-Type后面还有其它的头信息
to = i;
//既然得到了你想得到的,那就不要再循环啦,徒做无用功而已
break;
}
}
//解码HTTP响应头中的Content-Type
byte[] headerByte = Arrays.copyOfRange(respBuffer, from, to);
//HTTP响应头信息无中文,用啥解码都可以
String contentType = new String(headerByte);
//提取charset值
if(contentType.toLowerCase().contains("charset")){
respCharset = contentType.substring(contentType.lastIndexOf("=") + 1);
}
/**
* 解码HTTP响应的完整报文
*/
respMsg = bytesOut.toString(respCharset);
} catch (Exception e) {
System.out.println("与[" + reqURL + "]通信遇到异常,堆栈信息如下");
e.printStackTrace();
} finally {
if (null!=socket && socket.isConnected() && !socket.isClosed()) {
try {
//此时socket的输出流和输入流也都会被关闭
//值得注意的是:先后调用Socket的shutdownInput()和shutdownOutput()方法
//值得注意的是:仅仅关闭了输入流和输出流,并不等价于调用Socket.close()方法
//通信结束后,仍然要调用Socket.close()方法,因为只有该方法才会释放Socket占用的资源,如占用的本地端口等
socket.close();
} catch (IOException e) {
System.out.println("关闭客户机Socket时发生异常,堆栈信息如下");
e.printStackTrace();
}
}
}
respMap.put("reqMsg", reqMsg.toString());
respMap.put("respMsg", respMsg);
respMap.put("respMsgHex", respMsgHex);
return respMap;
}


/**
* 通过ASCII码将十进制的字节数组格式化为十六进制字符串
* @see 该方法会将字节数组中的所有字节均格式化为字符串
* @see 使用说明详见formatToHexStringWithASCII(byte[], int, int)方法
*/
private static String formatToHexStringWithASCII(byte[] data){
return formatToHexStringWithASCII(data, 0, data.length);
}


/**
* 通过ASCII码将十进制的字节数组格式化为十六进制字符串
* @see 该方法常用于字符串的十六进制打印,打印时左侧为十六进制数值,右侧为对应的字符串原文
* @see 在构造右侧的字符串原文时,该方法内部使用的是平台的默认字符集,来解码byte[]数组
* @see 该方法在将字节转为十六进制时,默认使用的是java.util.Locale.getDefault()
* @see 详见String.format(String, Object...)方法和new String(byte[], int, int)构造方法
* @param data 十进制的字节数组
* @param offset 数组下标,标记从数组的第几个字节开始格式化输出
* @param length 格式长度,其不得大于数组长度,否则抛出java.lang.ArrayIndexOutOfBoundsException
* @return 格式化后的十六进制字符串
*/
private static String formatToHexStringWithASCII(byte[] data, int offset, int length){
int end = offset + length;
StringBuilder sb = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
sb.append("\r\n------------------------------------------------------------------------");
boolean chineseCutFlag = false;
for(int i=offset; i sb.append(String.format("\r\n%04X: ", i-offset)); //X或x表示将结果格式化为十六进制整数
sb2.setLength(0);
for(int j=i; j if(j < end){
byte b = data[j];
if(b >= 0){ //ENG ASCII
sb.append(String.format("%02X ", b));
if(b<32 || b>126){ //不可见字符
sb2.append(" ");
}else{
sb2.append((char)b);
}
}else{ //CHA ASCII
if(j == i+15){ //汉字前半个字节
sb.append(String.format("%02X ", data[j]));
chineseCutFlag = true;
String s = new String(data, j, 2);
sb2.append(s);
}else if(j == i&&chineseCutFlag){ //后半个字节
sb.append(String.format("%02X ", data[j]));
chineseCutFlag = false;
String s = new String(data, j, 1);
sb2.append(s);
}else{
sb.append(String.format("%02X %02X ", data[j], data[j + 1]));
String s = new String(data, j, 2);
sb2.append