1.前言.
如题.
2.代码.
/*
* Copyright (c) 2015, S.F. Express Inc. All rights reserved.
*/
package com.test.test.test.send;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.test.test.test.util.SendConstants;
/**
*
* 描述:httpurl的http发送
* 作者:李俊南
*/
public class TestHttpMultiSendManagerTest implements TestSendManager {
private Logger logger = LoggerFactory
.getLogger(DrpHttpMultiSendManagerTest.class);
@Override
public String send(String url, String port, String content, String type) {
switch (type) {
case SendConstants.SEND_RES:
return sendRes(url, content);
case SendConstants.SEND_NO_RES:
return sendNoRes(url, content);
case SendConstants.SEND_ASY_RES:
return sendAsyRes(url, content);
case SendConstants.SEND_ASY_NO_RES:
return sendAsyNoRes(url, content);
default:
}
return null;
}
public String Object(String url, String content, String type) {
return send(url, "", content, type);
}
/**
* ͬ�发送
*
* @param url
* @param content
* @return String
* @throws ProtocolException
* @throws MalformedURLException
*/
public String sendRes(String sendUrl, String content) {
// URL url = new URL("http://localhost:8083/test");
URL url = null;
URLConnection rulConnection = null;
HttpURLConnection httpUrlConnection = null;
try {
url = new URL(sendUrl + SendConstants.SEND_PARAM_NAME
+ URLEncoder.encode(content, "utf8"));
rulConnection = url.openConnection();
httpUrlConnection = (HttpURLConnection) rulConnection;
httpUrlConnection.setDoOutput(true);
httpUrlConnection.setDoInput(true);
httpUrlConnection.setUseCaches(false);
httpUrlConnection.setConnectTimeout(5000);
httpUrlConnection.setReadTimeout(5000);
httpUrlConnection.setRequestProperty("Content-type", "text/html");
httpUrlConnection.setRequestMethod("POST");
httpUrlConnection.connect();
try (InputStream inStrm = httpUrlConnection.getInputStream();) {
// byte[] b = new byte[inStrm.available()];
// int len = 0;
// StringBuilder resultContent = new StringBuilder();
// while (len < inStrm.available()) {
// len += inStrm.read(b, len, inStrm.available() - len);
// resultContent.append(new String(b));
// }
// String result = resultContent.toString();
String result=getEncodedData(inStrm);
inStrm.close();
logger.info("返回:" + result);
return result;
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
if (null != httpUrlConnection) {
httpUrlConnection.disconnect();
}
}
}
/**
* 此方法用于从输入流中获取数据
*
* @param is 接收来自客户端socket对应的输入流
* @return 返回endodedData
* @throws IOException 抛出的异常,统一在run函数处理
*/
private String getEncodedData(InputStream is) throws IOException {
byte[] maxBuffer = new byte[1024 * 64];
int length = 0;
int lengthTemp = 0;
while (-1 != (lengthTemp = is.read(maxBuffer))) { // read方法并不保证一次能读取1024*64个字节
length += lengthTemp;
if (length >= 1024 * 64) {
logger.debug("读入的数据超过1024 * 64");
break;
}
}
byte[] endodedData = new byte[length];
System.arraycopy(maxBuffer, 0, endodedData, 0, length);
//logger.info("receiveData:" + bytesToHexString(endodedData) + '\n');
return new String(endodedData);
}
public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv+" ");
}
return stringBuilder.toString();
}
public String sendNoRes(String url, String content) {
return null;
}
public String sendAsyRes(String url, String content) {
return null;
}
public String sendAsyNoRes(String url, String content) {
return null;
}
}
3.注意事项.
(1)available读法有点不可靠,可能造成数据丢失,所以应该用字节读取办法来,代码中注释的available可对比一下替换的内容.
(2)字节转字符直接用new String()就可以了.