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

2014-11-24 11:39:21 · 作者: · 浏览: 47

[java]
package com.jadyer.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
* 使用JavaSocket编写发送HTTP_POST请求的工具类
* @see 与之类似的还有一个HttpClientUtil工具类
* @see 地址为http://blog.csdn.net/jadyer/article/details/8087960
* @see 还有一个使用Java原生API编写发送HTTP_POST请求的工具类
* @see 地址为http://blog.csdn.net/jadyer/article/details/8637228
* @create Apr 4, 2013 8:37:44 PM
* @author 玄玉
*/
public class HTTPUtil {
private HTTPUtil(){}

/**
* 发送HTTP_POST请求
* @see 本方法默认的连接超时和读取超时均为30秒
* @see 请求参数含有中文时,亦可直接传入本方法中,本方法内部会自动根据reqCharset参数进行URLEncoder.encode()
* @see 解码响应正文时,默认取响应头[Content-Type=text/html; charset=GBK]字符集,若无Content-Type,则使用UTF-8解码
* @param reqURL 请求地址
* @param reqParams 请求正文数据
* @param reqCharset 请求报文的编码字符集(主要针对请求参数值含中文而言)
* @return reqMsg-->HTTP请求完整报文,respMsg-->HTTP响应完整报文,respMsgHex-->HTTP响应的原始字节的十六进制表示
*/
public static Map sendPostRequest(String reqURL, Map reqParams, String reqCharset) {

StringBuilder reqData = new StringBuilder();
for (Map.Entry entry : reqParams.entrySet()) {
try {
reqData.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), reqCharset)).append("&");
} catch (UnsupportedEncodingException e) {
System.out.println("编码字符串[" + entry.getValue() + "]时发生异常:系统不支持该字符集[" + reqCharset + "]");
reqData.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
if (reqData.length() > 0) {
reqData.setLength(reqData.length() - 1); //删除最后一个&符号
}
return sendPostRequest(reqURL, reqData.toString(), reqCharset);
}


/**
* 发送HTTP_POST请求
* @see you can see {@link HTTPUtil#sendPostRequest(String, Map, String)}
* @see 注意:若欲直接调用本方法,切记请求参数值含中文时,一定要对该参数值URLEncoder.encode(value, reqCharset)
* @see 注意:这里只是对key=value中的'value'进行encode,而非'key='..encode完毕后,再组织成key=newValue传给本方法
*/
public static Map sendPostRequest(String reqURL, String reqData, String reqCharset){
Map respMap = new HashMap();
OutputStream out = null; //写
InputStream in = null; //读
Socket socket = null; //客户机
String respMsg = null;
String respMsgHex = null;
String respCharset = "UTF-8";
StringBuilder reqMsg = new StringBuilder();
try {
URL sendURL = new URL(reqURL);
String host = sendURL.getHost();
int port = sendURL.getPort()==-1 80 : sendURL.getPort();
/**
* 创建Socket
* @see ---------------------------------------------------------------------------------------------------
* @see 通过有参构造方法创建Socket对象时,客户机就已经发出了网络连接请求,连接成功则返回Socket对象,反之抛IOException
* @see 客户端在连接服务器时,也要进行通讯,客户端也需要分配一个端口,这个端口在客户端程序中不曾指定
* @see 这时就