使用Socket发送Http请求

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请求。当然部分细节需要自己去完善。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值