SOCKET模仿HTTP GET请求

一、为了更好理解HTTP协议,故用socket模仿http get请求,java代码如下:

package com.ppt.socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.URL;

public class SocketHttpGet {
	private final String END = "\r\n";
	private Socket client;
	private InputStream is;
	private OutputStream os;
	private String host;
	private String path;
	
	public SocketHttpGet(String url) {
		try {
			init(url);
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	private void init(String url) throws Exception {
		URL temp = new URL(url);
		this.host = temp.getHost();
		this.path = temp.getPath();
		int port = temp.getDefaultPort();
		client = new Socket();
		SocketAddress address = new InetSocketAddress(this.host, port);
		client.connect(address, 5000);
		client.setSoTimeout(10000);
		is = client.getInputStream();
		os = client.getOutputStream();
	}
	
	public void httpGet() throws IOException {
		StringBuffer sb = new StringBuffer();
		sb.append("GET "+ this.path +" HTTP/1.1" + END);
		sb.append("Host: " + this.host + END);
		sb.append("User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0)" + END);
		sb.append("Accept-Language:zh-cn" + END);
		sb.append("Accept-Encoding:deflate" + END);
		sb.append("Accept:*/*" + END);
		sb.append("Connection:Keep-Alive" + END);
		sb.append(END);
		String requestString = sb.toString();
		System.out.println(requestString);
		os.write(requestString.getBytes());
		os.flush();
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		String result = "";
		int contentLength = 0;
		int headLength = 0;
		while(true) {
			result=reader.readLine();
			headLength += result.length();
			if(result == null || "".equals(result.trim())) {
				break;
			}
			if(result.contains("Content-Length")) {
				String str = result.substring("Content-Length:".length(), result.length());
				contentLength = Integer.parseInt(str.trim());
			}
			System.out.println(result);
		}
		System.out.println("head length is: " + headLength);
		char[] rBuf = new char[5120];
		int readLength = 0;
		StringBuffer sbResult = new StringBuffer();
		while(readLength < contentLength) {
			int i = 0;
			try {
				i = reader.read(rBuf);
			} catch(Exception e) {
				e.printStackTrace();
				break;
			}
			readLength += i;
			sbResult.append(rBuf);
		}
		String str = sbResult.toString();
		System.out.println(str);
	}
	
	public static void main(String[] args) throws Exception {
		String url = "http://blog.csdn.net/jnu_simba/article/details/8957242";
		SocketHttpGet get = new SocketHttpGet(url);
		get.httpGet();
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值