Java Dev Notes - 8 - Http请求模拟

模拟Http请求

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class HttpClient {

	public static final int port = 80;
	public static String host = null;
	private Socket socket;
	private InputStream in;
	private OutputStream out;
	private int msgCnt = 0;
	private long msgUp = 0;
	private long msgDown = 0;
	private long startTime = 0;
	private long endTime = 0;
	private long runTime = 0;
	private long bytesSent = 0;
	private long bytesRecv = 0;
	private int error = 0;
	private int length = 0;
	private String request = null;
	private String lineBuffer = null;
	private String url = null;
	private byte[] data = new byte[256];
	private String pagePath = null;

	/** buffer */
	private static final int maxSize = 0x10000;
	private byte[] buffer = new byte[maxSize];
	private int bufferStart = 0;
	private int bufferEnd = 0;
	private int bufferUsed = 0;
	private String charset = "UTF-8";
	private String lastRemains = "";

	public static void main(String[] args) {
		HttpClient httpClient = new HttpClient();
		httpClient.setMsgInfo(1, 16, 1000);
		httpClient.setUrl("http://www.example.com");
		httpClient.start();
	}

	public HttpClient() {
	}	

	public void setMsgInfo(int messageCnt, long messageUp, long messageDown) {
		msgCnt = messageCnt;
		msgUp = messageUp;
		msgDown = messageDown;
	}

	public void setUrl(String URL) {
		url = URL;
		if (msgDown > 0)
			url = url + "?MsgDown=" + String.valueOf(msgDown);
	}

	public void start() {

		fillMsg();

		if (url != null)
			parseUrl();
		else {
			System.err.println("URL Parse Error.");
			return;
		}

		buildRequest();

		startTime = System.currentTimeMillis();
		
		for (int i = 0; i < msgCnt; i++) {
			doRun();
		}

		System.out.println("Total Bytes Read: " + String.valueOf(bytesRecv));
		System.out.println("Total Bytes Sent: " + String.valueOf(bytesSent));

		endTime = System.currentTimeMillis();
		if (endTime > startTime)
			runTime = endTime - startTime;
		System.out.println("runtime: " + String.valueOf(runTime));

	}

	public void doRun() {

		try {
			 InetSocketAddress socketAddr = new InetSocketAddress(
			 "192.168.31.139", 8080);
//			 InetSocketAddress socketAddr = new InetSocketAddress(
//			 "192.168.31.252", 8080);
//			InetSocketAddress socketAddr = new InetSocketAddress(
//					"114.80.220.94", 8080);
//			InetSocketAddress socketAddr = new InetSocketAddress(
//					"50.19.210.40", 8080);
//			 InetAddress inetAddr = InetAddress.getByName("www.dianping.com");
//			 InetSocketAddress socketAddr = new InetSocketAddress(inetAddr,
//			 port);
			socket = new Socket();
			socket.setKeepAlive(true);
			socket.setTcpNoDelay(true);
			socket.connect(socketAddr, 30 * 1000);
		} catch (IOException e) {
			System.out.println("Connection Fail!");
			System.out.println("socket closing...");
			try {
				socket.close();
			} catch (IOException e2) {
			}
			return;
		}

		try {
			in = socket.getInputStream();
			out = socket.getOutputStream();
		} catch (IOException e) {
			try {
				System.out.println("closing...");
				socket.close();
				return;
			} catch (IOException e2) {
			}
			return;
		}

		try {
			transport();

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {				
				System.out.println("closing...");
				in.close();
				out.close();
				socket.close();
			} catch (IOException e) {
			}
		}
	}

	public void transport() throws IOException {
		byte[] bytesRequest = request.getBytes("utf-8");
		int requestSize = bytesRequest.length;
		out.write(bytesRequest);
		System.out.println("Request Sent: " + String.valueOf(requestSize)
				+ " bytes.");
		bytesSent += requestSize;

		if (msgUp > 0) {
			int integerPart = (int) msgUp / 256;
			int fractionPart = (int) msgUp % 256;
			for (int i = 0; i < integerPart; i++) {
				out.write(data);
			}
			out.write(data, 0, fractionPart);
			System.out.println("Content sent: " + String.valueOf(msgUp)
					+ " bytes.");
			bytesSent += msgUp;
		}
		out.flush();

		File file = new File("log.dat");
		OutputStream fis = new FileOutputStream(file, true);
		fis.write("\r\n".getBytes("utf-8"));

		resetBuffer();
		lineBuffer = readLine();
		if (lineBuffer == null)
			return;
		String[] lineSplits = lineBuffer.split(" ");
		if (lineSplits.length != 3)
			return;
		byte[] bytesLine = lineBuffer.getBytes("UTF-8");
		if (lineSplits[1].equals("200") == false) {
			System.out.println(lineBuffer);
			fis.write(bytesLine);
			return;
		}

		while (lineBuffer.equals("\r\n") == false) {
			System.out.print(lineBuffer);
			if (lineBuffer.startsWith("Content-Length: ") == true) {
				int separater = lineBuffer.indexOf(" ");
				msgDown = Long.parseLong(lineBuffer.substring(separater + 1,
						lineBuffer.length() - 2));
			}
			lineBuffer = readLine();
		}
		System.out.println("Response Read: " + String.valueOf(length)
				+ " bytes.");
		bytesRecv += length;

		/** parse content */
		if (msgDown <= 0)
			return;
		msgUp = 0;
		fis.write("\r\n".getBytes("utf-8"));
		while (msgUp < msgDown) {
			length = readBuffer();
			fis.write(buffer, 0, length);
			msgUp += length;
		}
		System.out.println("Content Read: " + String.valueOf(msgDown)
				+ " bytes.");
		bytesRecv += msgDown;

		fis.flush();
		fis.close();
	}

	public void buildRequest() {

		/** if msgUp == 0 we use get methods, if not we use post methods */
		StringBuilder str = new StringBuilder();

		if (msgUp == 0)
			str.append("GET ");
		else
			str.append("POST ");
		str.append(pagePath);
		str.append(" HTTP/1.1");
		str.append("\r\n");

		str.append("Host: ");
		str.append(host);
		str.append("\r\n");
		str.append("User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0");
		str.append("\r\n");
		str.append("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
		str.append("\r\n");
		str.append("Accept-Language: zh-cn,zh;q=0.5");
		str.append("\r\n");
		str.append("Accept-Encoding: deflator");
		str.append("\r\n");
		str.append("Accept-Charset: utf-8;q=0.7,*;q=0.7");
		str.append("\r\n");
		str.append("Connection: keep-alive");
		str.append("\r\n");
		str.append("Cookie: is=328346358715; cy=1; _hc.v=\"ddaedb1c-65f8-455a-96e6-d0e7ec887f74.1304392742\"; __utma=205923334.1348807413944297000.1304392740.1309224180.1309229112.34; __utmz=205923334.1305772974.15.2.utmcsr=baidu|utmccn=(organic)|utmcmd=organic|utmctr=%C9%CF%BA%A3%CA%D0%C8%CB%B2%C5%B7%FE%CE%F1%D6%D0%D0%C4; aburl=1; isVisited=1; ano=tAGumb01zAEkAAAANDYzYTFjNDQtZjJmMy00MjVlLTk1NWMtYTc5NmY2NGM1MDdmFsqWWOryRlMl50hhgujk6MczCJA1; sid=bgyw5n45zog5pi454ohwcwjo; lb.dp=201392394.20480.0000; __utmc=205923334; __utmb=205923334.13.10.1309229112");
		str.append("\r\n");
		if (msgUp > 0) {
			str.append("Content-Length: ");
			str.append(msgUp);
		}
		str.append("\r\n");
		str.append("\r\n");
		request = str.toString();
	}

	public void parseUrl() {
		if (url.startsWith("http:"))
			url = url.substring(7);
		int separator = url.indexOf('/');
		if (separator == -1) {
			separator = url.indexOf('?');
			host = url.substring(0, separator);
			pagePath = url.substring(separator);
		} else {
			host = url.substring(0, separator);
			pagePath = url.substring(separator);
		}
	}

	public long getRunTime() {
		return runTime;
	}

	public int getErrorCode() {
		return error;
	}

	public void fillMsg() {
		for (int i = 0; i < 256; i++) {
			data[i] = (byte) i;
		}
	}

	public String readLine() throws IOException {
		while (buffer[bufferEnd] != '\n') {
			if (bufferEnd >= bufferUsed) {
				length += bufferUsed - bufferStart;
				lastRemains = lastRemains
						+ new String(buffer, bufferStart, bufferUsed
								- bufferStart, charset);
				bufferUsed = in.read(buffer);
				if (bufferUsed == -1)
					return null;
				else {
					bufferEnd = bufferStart = 0;
				}
			}
			bufferEnd++;
		}
		length += bufferEnd - bufferStart + 1;
		String rtn = new String(buffer, bufferStart, bufferEnd - bufferStart
				+ 1, charset);
		rtn = lastRemains + rtn;
		lastRemains = "";
		bufferEnd++;
		bufferStart = bufferEnd;
		return rtn;
	}

	public void resetBuffer() {
		bufferStart = bufferEnd = bufferUsed = 0;
		lastRemains = "";
		length = 0;
	}
	
	
	public int readBuffer() throws IOException {
		if (bufferUsed == 0 || bufferStart == bufferUsed) {
			resetBuffer();
			bufferUsed = in.read(buffer);
			return bufferUsed;
		} else {
			int rtn = bufferUsed - bufferStart;
			resetBuffer();
			return rtn;
		}
	} 
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值