`
nannan408
  • 浏览: 1783634 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

架构师之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()就可以了.
0
1
分享到:
评论
2 楼 nannan408 2015-07-10  
这两种性能都跟不上httpurlConnetion,选方案应该综合考虑,现在封装不是问题,框架要慎重考虑的,一个系统一定考虑维护性,特别是基础系统,尽量不用开源。
1 楼 qindongliang1922 2015-06-17  
可以看下httpclient或者jsoup

相关推荐

    HttpURLConnection-Vegetables

    在`HttpURLConnection-Vegetables`项目中,可能涉及的是利用`HttpURLConnection`向蔬菜相关的API发送请求,获取或发送蔬菜的数据。你可以从文件列表中找到具体的代码示例,了解如何组织请求和解析响应。这样的实践有...

    使用HttpURLConnection发送短信

    ### 使用HttpURLConnection发送短信 在Java开发中,通过网络接口实现短信发送是一种常见的应用场景,例如在用户注册、找回密码等场景下验证用户身份时。本文将详细介绍如何利用`HttpURLConnection`来实现短信发送...

    HttpURLConnection读取本地目录上传远程服务器

    本话题主要关注如何使用`HttpURLConnection`来实现从本地目录读取资源并上传到远程服务器的功能。 首先,`HttpURLConnection`是`java.net.URL`类的子类,它可以建立与指定URL所代表的服务器的连接,并执行HTTP协议...

    网络请求----HttpURLConnection的get,post和图片加载

    - 连接管理和超时:设置适当的连接超时和读取超时,防止程序挂起。 - 使用HTTPS:如果涉及到敏感信息传输,应使用HTTPS保证通信安全。 5. 性能优化: - 使用连接池:复用HttpURLConnection实例,减少TCP三次握手...

    Android25图灵聊天项目------HttpURLConnection请求get文本数据

    它在URL中携带参数,通过这种方式向服务器发送请求。GET请求的安全性和幂等性相对较弱,即同一个请求可能会产生不同的结果,或者对服务器有副作用。 HttpURLConnection是Java SDK内置的一个类,可以用来建立HTTP...

    JAVA通过HttpURLConnection 上传和下载文件的方法

    HttpURLConnection是一个Java类,用于从网络中读取数据或向网络中写入数据。下面将详细介绍JAVA通过HttpURLConnection上传和下载文件的方法。 一、HttpURLConnection的概述 HttpURLConnection是Java中的一个类,...

    HttpURLConnection文件下载\httpURLConnection文件下载

    通过循环读取输入流并写入输出流,直到所有数据都被读取和写入。 当下载完成后,关闭输入流和输出流以释放资源。整个过程遵循了Java的"流式编程"模型,即通过流对象将数据从源头(网络)传输到目的地(本地文件)。...

    小码农的代码(五)----------web交互之HTTP传输HttpURLConnection

    本文将深入探讨"小码农的代码(五)----------web交互之HTTP传输HttpURLConnection"这一主题,结合提供的标签"源码"和"工具",我们将讨论如何使用Java中的HttpURLConnection类来实现HTTP请求,以及它在实际开发中的...

    即时访问网络图片文件展示---HttpURLConnection

    标题中的“即时访问网络图片文件展示---HttpURLConnection”是指通过Java的HttpURLConnection类来实现从网络上获取并显示图片的功能。HttpURLConnection是Java标准库提供的一种HTTP协议的网络连接工具,它允许应用...

    HttpURLConnection之基础

    - `getInputStream()`和`getErrorStream()`:分别用于读取正常响应和错误响应的数据流。 ### 5. 示例代码 ```java // GET请求示例 URL url = new URL("http://example.com"); HttpURLConnection conn = ...

    AndroidHttpURLConnection发送GET请求

    调用URL对象的openConnection( )来获取HttpURLConnection对象实例: HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 设置HTTP请求使用的方法:conn.setRequestMethod("GET"); 设置连接超时,...

    Android-使用HttpURLConnection实现断点续传

    **步骤5:异常处理和关闭流** 在下载过程中可能会遇到各种异常,如网络断开、存储空间不足等。我们需要捕获这些异常并作出相应处理,如暂停下载或提示用户。最后,记得关闭输入/输出流。 ```java try { // 下载...

    本示例使用HttpUrlConnection实现上传文件

    本示例重点讲解如何利用Java内置的HttpURLConnection类来完成这个任务。HttpURLConnection是Java标准库提供的一种轻量级的HTTP客户端接口,适用于简单的HTTP通信场景。 首先,我们来看一下上传文件的基本流程: 1....

    HttpUrlConnection使用示例

    这个类提供了一种高效且灵活的方式来发送HTTP请求并接收响应,是替代过时的`java.net.URL`和`java.net.HttpURLConnection`的一个优秀选择。本篇文章将深入探讨如何使用`HttpURLConnection`以POST方式提交请求。 ###...

    Android HttpUrlConnection json使用方法

    例如,`JSONObject`和`JSONArray`类分别用于解析JSON对象和数组。我们可以通过`get()`或`opt()`方法获取键值,`has()`检查键是否存在,`put()`添加键值对等。 4. RESTful服务: 提到的“RESTfulExample”可能指的...

    Httpurlconnection

    除了基本的请求和响应处理,HttpURLConnection还支持设置连接超时和读取超时,这对于防止程序在等待响应时阻塞非常重要: ```java connection.setConnectTimeout(5000); // 设置连接超时为5秒 connection....

    Android HttpURLConnection 读取网络图片.rar

     这次的HttpURLConnection仅针对Http连接,效率胜于URLConnection。new URL对象将网址传入  HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();// 取得连接  conn.connect();  ...

Global site tag (gtag.js) - Google Analytics