1、建立TCP连接。
SocketAddress addr = new InetSocketAddress("www.baidu.com",80);
Socket sock = new Socket();
sock.connect(addr);
2、构建HTTP请求头并发送HTTP请求。
String[] headers = {"GET / HTTP/1.1\r\n","Host: www.baidu.com\r\n","\r\n"};
OutputStream out = sock.getOutputStream();
for(int i=0; i<headers.length; i++)
out.write(headers[i].getBytes());
out.flush();
headers可以根据需要自行构建,可以增加更多内容。但是请保证headers[i]以"\r\n"结尾,最后一个元素为"\r\n"。
3、接收HTTP响应。
InputStream in = sock.getInputStream();
StringBuffer buf = new StringBuffer();
sock.setSoTimeout(2000);
while(true) {
try {
len = in.read(b);
buf.append(new String(b,0,len,"UTF-8"));
} catch(SocketTimeoutException e) {
in.close();
out.close();
sock.close();
break;
}
}
使用setSoTimeout(),单位毫秒。因为每次从网络读完文件之后,read()函数仍会一直阻塞直到socket超时。即使代码改成
while((len=in.read(b)) != -1) {//省略try catch
buf.append(new String(b,0,len,"UTF-8"));
}
这样,也没有办法阻止读完之后的阻塞等待。所以设置一个合适的超时时间来避免这种情况。如果哪位可以解决这个问题,欢迎留言。
4、分离响应头与正文。
String[] result = buf.toString().split("\r\n\r\n");//result[0]为响应头 result[1]为正文
经过这四步,即可完成一次HTTP请求。当然部分细节需要自己去完善。