使用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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Linux socket 初步
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- RPC failed; result=22, HTTP code = 411
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序