您的位置:首页 > 理论基础 > 计算机网络

使用Socket发送Http请求

2016-05-05 13:45 369 查看

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();
int pos = result.indexOf("\r\n\r\n");//第一个\r\n\r\n的位置,正文内可能也有\r\n\r\n
String header = result.subString(0,pos);
String text = result.subString(pos+4);


经过这四步,即可完成一次HTTP请求。当然部分细节需要自己去完善。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java Socket Http