架构师之httpurlconnection----------读取和发送(流读取效率通用类)

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()就可以了.

猜你喜欢

转载自nannan408.iteye.com/blog/2220272