使用Socket发送Http请求

来源:互联网 发布:编程教学 编辑:程序博客网 时间:2024/05/02 00:54

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\nString header = result.subString(0,pos);String text = result.subString(pos+4);

经过这四步,即可完成一次HTTP请求。当然部分细节需要自己去完善。


0 0
原创粉丝点击