自己实现一个 httpclient,支持gzip压缩。原型,带扩展

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.zip.GZIPInputStream;

import org.apache.http.util.ByteArrayBuffer;

/**
* @author Administrator
*/
public class HTTPTest {
static String CRLF = ”
“;
static String CR = ”
“;
static String LF = ”
“;
static char CR_C = ’
‘;
static char LF_C = ’
‘;

public static void printOut(OutputStream os, String str) throws IOException {
os.write(str.getBytes());
//os.flush();
}
public static byte[] append(byte[] head,byte[] buf){
byte[] res=new byte[head.length+buf.length];
int index=0;
while(index<head.length){
res[index]=head[index];
index++;
}
while(index<buf.length){
res[index]=buf[index];
index++;
}
return res;
}
public static void printGzip(InputStream is) throws IOException {
GZIPInputStream gis = new GZIPInputStream(is);
byte[] buf = new byte[4096]; // 缓冲区大小
ByteArrayBuffer bab= new ByteArrayBuffer(0);
byte[] res =  new byte[0];
int num;
int offset=0;
while ((num = gis.read(buf, 0, buf.length))>0) { // 如果文件未读完
//   System.out.print(“read size=” + num + ”,content=” + new String(buf, ”utf-8″));
System.out.println(“read size=” + num + ”,offset=” + offset);
bab.append(buf,0,num);
offset+=num;
}
System.out.print(new String(bab.toByteArray()));
//  gis.close();
}
public static void printChunk(InputStream is) throws IOException {
String line = readLine(is);
System.out.println(line);
}
public static String readLine(InputStream is) throws IOException {
Integer bt=is.read();
byte[] buf=new byte[1024];
int index=0;
while (true) {
System.out.format(“%3d,%2h,%3c
“, bt, bt, bt);
buf[index++]=bt.byteValue();
if (bt == LF_C) {
bt = is.read();
if (bt == CR_C)
System.out.print(CRLF);
break;
}else
bt = is.read();
}
return new String(buf);
}
public static void printIn(InputStream is) throws IOException {
printStatus(is);
printHead(is);
//  printGzip(is);
//  printChunk(is);
while (true) {
int size = is.available();
if (size <= 0)
break;
byte[] by = new byte[size];
is.read(by);
// System.out.println(“read size=” + is.read(by));
System.out.println(new String(by, ”UTF-8″));
}
}

public static void printStatus(InputStream is) throws IOException {
byte buf[] = new byte[1024];
while (true) {
int bt = is.read();
//   System.out.format(“%d,%h,%c
“, bt, bt, bt);
System.out.format(“%c”, bt);
if (bt == LF_C) {
bt = is.read();
if (bt == CR_C)
System.out.print(CRLF);
break;
}
}
}

public static void printHead(InputStream is) throws IOException {
byte buf[] = new byte[1024];
int bt ;
bt = is.read();
while (true) {
//   System.out.format(“%d,%h,%c
“, bt, bt, bt);
System.out.format(“%c”, bt);
if (bt == LF_C) {
bt = is.read();
if (bt == CR_C) {
System.out.print(CRLF);
bt = is.read();
if (bt == LF_C) {
bt = is.read();
if (bt == CR_C) {
System.out.print(CRLF);
break;
}
}
}
}else
bt = is.read();
}
}

public static void main(String[] args) {
try {
//   String host = ”www.nibbuns.co.kr“;
//   String host = ”www.naver.com“;
String host = ”news.kbs.co.kr”;
int port = 80;
Socket soc = new Socket(host, port);
System.out.println(soc.isConnected());
//   String com = ”GET /?cm_id=10269049&clickPid=mall_pid_29946&NaPm=ct=h4qe66uw|ci=0JO1002hP0feZPGb00b7|tr=sbtsbb|sn=79139|hk=bea2a4b1666f2ad3bbf9755caab183ce607056cf HTTP/1.1″ + CRLF;
//   String com = ”GET /css/main_20120710.css HTTP/1.1″ + CRLF;
String com = ”GET http://news.kbs.co.kr/society/2012/07/17/2504803.htmlHTTP/1.1″ + CRLF;
printOut(soc.getOutputStream(), com);
printOut(soc.getOutputStream(), ”Host: news.kbs.co.kr
“);
//   printOut(soc.getOutputStream(), ”Connection: keep-alive
“);
printOut(soc.getOutputStream(), ”User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11
“);
printOut(soc.getOutputStream(), ”Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
“);
printOut(soc.getOutputStream(), ”Accept-Encoding: gzip,deflate,sdch
“);
printOut(soc.getOutputStream(), ”Accept-Language: zh-CN,zh;q=0.8,ko;q=0.6
“);
printOut(soc.getOutputStream(), ”Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3
“);
printOut(soc.getOutputStream(), ”If-Modified-Since: Thu, 05 Mar 2011 02:56:12 GMT
“);
//   printOut(soc.getOutputStream(), ”Cookie: kbs.co.kr=T; AUTHCHK=F; AUTHERR=0; _EXEN=3; JSESSIONID=1F8ZiOhvLpTXVgUnlHytDrqZFtnPcVzCGE9hIZaRYDS1EwMrsrkgxnjAPrjWtJKz.was02_servlet_engine2; news_font_size=14
“);

printOut(soc.getOutputStream(), CRLF);
soc.getOutputStream().flush();
Thread.sleep(1000);
//   printGzip(soc.getInputStream());
printIn(soc.getInputStream());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

 

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>