模拟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;
}
}
}