首页>代码>apache hessian原理学习和自己实现rpc远程调用实例代码>/hessian-study/modules/hessian-study-server/src/main/java/com/jzx/httprpc/HttpProxy.java
package com.jzx.httprpc;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLConnection;

import com.jzx.hessian.vo.UserVo;
import com.jzx.httprpc.utils.ObjectUtils;

public class HttpProxy implements InvocationHandler {
	String url = "";
	HttpProxyFactory httpProxyFactory;
	Class<?> api;

	public HttpProxy(String url, HttpProxyFactory httpProxyFactory, Class<?> api) {
		this.url = url;
		this.httpProxyFactory = httpProxyFactory;
		this.api = api;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		HttpTransportation transportation = new HttpTransportation();
		transportation.setClazz(api);
		transportation.setMethod(method.getName());
		transportation.setParams(args);
		byte[] bytes = ObjectUtils.objectToByte(transportation);
		Object result = sendPost(url, bytes);
		return result;
	}

	// 发送POST请求
	public static Object sendPost(String url, byte[] param) {
		PrintWriter out = null;
		BufferedReader in = null;
		Object result = null;
		try {
			URL realUrl = new URL(url);
			// 打开和URL之间的连接
			URLConnection conn = realUrl.openConnection();
			// 设置通用的请求属性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			// 获取URLConnection对象对应的输出流
			OutputStream outputStream = conn.getOutputStream();
			outputStream.write(param);
			outputStream.close();
			// 定义BufferedReader输入流来读取URL的响应
			// in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			byte[] bytes = toByteArray(conn.getInputStream());
			Object object = ObjectUtils.byteToObject(bytes);
			if (object instanceof String) {
				byte[] dest = new byte[bytes.length - 7];
				System.arraycopy(bytes, 7, dest, 0, dest.length);
				result = new String(dest, "UTF-8");
//				result = new String(bytes, "UTF-8");
			}
			if (object instanceof UserVo) {
				result = object;
			}
		} catch (Exception e) {
			System.out.println("发送 POST 请求出现异常!" + e);
			e.printStackTrace();
		}
		// 使用finally块来关闭输出流、输入流
		finally {
			try {
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return result;
	}

	public static byte[] subBytes(byte[] src, int begin, int count) {
		byte[] bs = new byte[count];
		for (int i = begin; i < begin + count; i++)
			bs[i - begin] = src[i];
		return bs;
	}

	// 下面是IOUtils中摘录出与toByteArray相关的方法
	// org.apache.commons.io.IOUtils.toByteArray
	public static byte[] toByteArray(InputStream input) throws IOException {
		ByteArrayOutputStream output = new ByteArrayOutputStream();
		copy(input, output);
		return output.toByteArray();
	}

	public static int copy(InputStream input, OutputStream output) throws IOException {
		long count = copyLarge(input, output);
		if (count > 2147483647L) {
			return -1;
		}
		return (int) count;
	}

	public static long copyLarge(InputStream input, OutputStream output) throws IOException {
		byte[] buffer = new byte[4096];
		long count = 0L;
		int n = 0;
		while (-1 != (n = input.read(buffer))) {
			output.write(buffer, 0, n);
			count += n;
		}
		return count;
	}
}
最近下载更多
chengqiang  LV13 2019年10月11日
nima74  LV11 2019年9月23日
loverzhao  LV14 2019年2月13日
@MR_K  LV11 2018年3月26日
向死而生  LV2 2017年3月3日
vsalw5320  LV12 2016年12月23日
最代码官方  LV168 2016年12月22日
最近浏览更多
17842711  LV1 2022年3月27日
newhaijun  LV15 2021年6月5日
a3870764722a  LV22 2020年4月13日
kevinkg  LV12 2020年4月3日
chengqiang  LV13 2019年10月11日
nima74  LV11 2019年9月20日
Riku2018  LV2 2019年7月29日
free sadn  LV11 2019年3月24日
时空12580  LV13 2019年2月27日
loverzhao  LV14 2019年2月13日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友