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

2014-11-24 11:39:21 · 作者: · 浏览: 52
e()).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 这时就由客户端操作系统自动分配一个空闲的端口,默认的是自动的连续分配
* @see 如服务器端一直运行着,而客户端不停的重复运行,就会发现默认分配的端口是连续分配的
* @see 即使客户端程序已经退出了,系统也没有立即重复使用先前的端口
* @see socket = new Socket(host, port);
* @see ---------------------------------------------------------------------------------------------------
* @see 不过,可以通过下面的方式显式的设定客户端的IP和Port
* @see socket = new Socket(host, port, InetAddress.getByName("127.0.0.1"), 8765);
* @see ---------------------------------------------------------------------------------------------------
*/
socket = new Socket();
/**
* 设置Socket属性
*/
//true表示关闭Socket的缓冲,立即发送数据..其默认值为false
//若Socket的底层实现不支持TCP_NODELAY选项,则会抛出SocketException
socket.setTcpNoDelay(true);
//表示是否允许重用Socket所绑定的本地地址
socket.setReuseAddress(true);
//表示接收数据时的等待超时时间,单位毫秒..其默认值为0,表示会无限等待,永远不会超时
//当通过Socket的输入流读数据时,如果还没有数据,就会等待
//超时后会抛出SocketTimeoutException,且抛出该异常后Socket仍然是连接的,可以尝试再次读数据
socket.setSoTimeout(30000);
//表示当执行Socket.close()时,是否立即关闭底层的Socket
//这里设置为当Socket关闭后,底层Socket延迟5秒后再关闭,而5秒后所有未发送完的剩余数据也会被丢弃
//默认情况下,执行Socket.close()方法,该方法会立即返回,但底层的Socket实际上并不立即关闭
//它会延迟一段时间,直到发送完所有剩余的数据,才会真正关闭Socket,断开连接
//Tips:当程序通过输出流写数据时,仅仅表示程序向网络提交了一批数据,由网络负责输送到接收方
//Tips:当程序关闭Socket,有可能这批数据还在网络上传输,还未到达接收方
//Tips:这里所说的"未发送完的剩余数据"就是指这种还在网络上传输,未被接收方接收的数据
socket.setSoLinger(true, 5);
//表示发送数据的缓冲区的大小
socket.setSendBufferSize(1024);
//表示接收数据的缓冲区的大小
socket.setReceiveBufferSize(1024);
//表示对于长时间处于空闲状态(连接的两端没有互相传送数据)的Socket,是否要自动把它关闭,true为是
//其默认值为false,表示TCP不会监视连接是否有效,不活动的客户端可能会永久存在下去,而不会注意到服务器已经崩溃
socket.setKeepAlive(true);
//表示是否支持发送一个字节的TCP紧急数据,socket.sendUrgentData(data)用于发送一个字节的TCP紧急数据
//其默认为false,即接收方收到紧急数据时不作任何处理,直接将其丢弃..若用户希望发送紧急数据,则应设其为true
//设为true后,接收方会把收到的紧急数据与普通数据放在同样的队列中
socket.setOOBInline(true);
//该方法用于设置服务类型,以下代码请求高可靠性和最小延迟传输服务(把0x04与0x10进行位或运算)
//Socket类用4个整数表示服务类型
//0x02:低成本(二进制的倒数第二位为1)
//0x04:高可靠性(二进制的倒数第三位为1)
//0x08:最高吞吐量(二进制的倒数第四位为1)
//0x10:最小延迟(二进制的倒数第五位为1)
s