使用socket模拟Http请求

这里举一个简单的例子,使用socket来模拟一段http访问百度代码

封装的工具类如下,方法叫XHttp()

package com.spider.net;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NetUtil {

	public static final int FORMAT_IMAGE=1;
	public static final int FORMAT_VIDEO=2;
	public static final int FORMAT_TEXT=3;

	public static String Http(String url)
	{
		return null;
	}

	public static String XHttp(String url,int port)
	{
		String ret = null;

		Socket mSocket=null;
		OutputStream os=null;
		InputStream ins=null;
		try {
			String host=getHost(url);

			mSocket=new Socket(host, port);
			os=mSocket.getOutputStream();
			ins=mSocket.getInputStream();

			StringBuffer sb=new StringBuffer();
			sb.append("GET ").append(url).append(" HTTP/1.1").append("\r\n");
			sb.append("Host").append(": ").append(host).append("\r\n");
			sb.append("Connection").append(": ").append("Close").append("\r\n");
			sb.append("Accept").append(": ").append("*/*").append("\r\n");
			sb.append("\r\n");//end

			os.write(sb.toString().getBytes());
			os.flush();

			sb=new StringBuffer();
			BufferedReader br=new BufferedReader(new InputStreamReader(ins));
			String str=null;
			while((str=br.readLine())!=null)
			{
				sb.append(str);
				System.out.println(str);
			};
			br.close();
			ret=sb.toString();

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(null!=mSocket)
			{
				try {
					mSocket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if(null!=os)
			{
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if(null!=ins)
			{
				try {
					ins.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		return ret;
	}

	public static String getHost(String url)
	{
		Pattern p = Pattern.compile("(http://|https://)?([^/]*)",Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(url);
		return m.find()?m.group(2):url;
	}
}

测试代码如下:

package com.spider.test;

import com.spider.net.NetUtil;

public class TestMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		NetUtil.XHttp("http://www.baidu.com", 80);

	}

}

输入结果如下:

HTTP/1.1 200 OK
Date: Sat, 17 May 2014 12:55:12 GMT
Server: Apache
P3P: CP=" OTI DSP COR IVA OUR IND COM "
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=7EF751AE135FF261360F9E448B0F01F2:FG=1; expires=Sun, 17-May-15 12:55:12 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Set-Cookie: BAIDUID=7EF751AE135FF261C97AD369F7B6986E:FG=1; expires=Sun, 17-May-15 12:55:12 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
Last-Modified: Tue, 31 Dec 2013 11:13:44 GMT
ETag: "1cdb-4eed2a7498a00"
Accept-Ranges: bytes
Content-Length: 7387
Cache-Control: max-age=1
Expires: Sat, 17 May 2014 12:55:13 GMT
Vary: Accept-Encoding,User-Agent
Connection: Close
Content-Type: text/html

<!doctype html><html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><title>?????£???????      </title><style>html{overflow-y:auto}body{font:12px arial;text-align:center;background:#fff}body,p,form,ul{margin:0;padding:0}body,form,#fm{position:relative}td{text-align:left}img{border:0}a{color:#00c}a:active{color:#f60}#u{padding:7px 10px 3px 0;text-align:right}#m{width:680px;margin:0 auto}#nv{font-size:16px;margin:0 0 4px;text-align:left;text-indent:117px}#nv a,#nv b,.btn,#lk{font-size:14px}#fm{padding-left:90px;text-align:left}#kw{width:404px;height:22px;padding:4px 7px;padding:6px 7px 2px\9;font:16px arial;background:url(http://www.baidu.com/img/i-1.0.0.png) no-repeat -304px 0;_background-attachment:fixed;border:1px solid #cdcdcd;border-color:#9a9a9a #cdcdcd #cdcdcd #9a9a9a;vertical-align:top}.btn{width:95px;height:32px;padding:0;padding-top:2px\9;border:0;background:#ddd url(http://www.baidu.com/img/i-1.0.0.png) no-repeat;cursor:pointer}.btn_h{background-position:-100px 0}#kw,.btn_wr{margin:0 5px 0 0}.btn_wr{width:97px;height:34px;display:inline-block;background:url(http://www.baidu.com/img/i-1.0.0.png) no-repeat -202px 0;_top:1px;*position:relative}#lk{margin:33px 0}#lk span{font:14px "????"}#lm{height:60px}#lh{margin:16px 0 5px;word-spacing:3px}#mCon{height:18px;line-height:18px;position:absolute;right:7px;top:8px;top:10px\9;cursor:pointer;padding:0 18px 0 0;background:url(http://www.baidu.com/img/bg-1.0.0.gif) no-repeat right -134px;background-position:right -136px\9}#mCon span{color:#00c;cursor:default;display:block}#mCon .hw{text-decoration:underline;cursor:pointer}#mMenu{width:56px;border:1px solid #9a99ff;list-style:none;position:absolute;right:7px;top:28px;display:none;background:#fff}#mMenu a{width:100%;height:100%;display:block;line-height:22px;text-indent:6px;text-decoration:none}#mMenu a:hover{background:#d9e1f6}#mMenu .ln{height:1px;background:#ccf;overflow:hidden;margin:2px;font-size:1px;line-height:1px}#cp,#cp a{color:#77c}#sh{display:none;behavior:url(#default#homepage)}</style></head>
<body><p id="u"><a href="/gaoji/preferences.html">????????</a> | <a href="http://passport.baidu.com/?login&tpl=mn">???</a></p><div id="m"><p id="lg"><img src="http://www.baidu.com/img/baidu_sylogo1.gif" width="270" height="129" usemap="#mp"></p><p id="nv"><a href="http://news.baidu.com">?? ??</a>??<b>?? ?</b>??<a href="http://tieba.baidu.com">?? ??</a>??<a href="http://zhidao.baidu.com">? ??</a>??<a href="http://mp3.baidu.com">MP3</a>??<a href="http://image.baidu.com">? ?</a>??<a href="http://video.baidu.com">?? ?</a>??<a href="http://map.baidu.com">?? ?</a></p><div id="fm"><form name="f" action="/s"><input type="text" name="wd" id="kw" maxlength="100"><input type="hidden" name="rsv_bp" value="0"><span class="btn_wr"><input type="submit" value="??????" id="su" class="btn" onmousedown="this.className=‘btn btn_h‘" onmouseout="this.className=‘btn‘"></span></form><div id="mCon"><span>????</span></div><ul id="mMenu"><li><a href="#" name="ime_hw">??д</a></li><li><a href="#" name="ime_py">???</a></li><li class="ln"></li><li><a href="#" name="ime_cl">???</a></li></ul></div>
<p id="lk"><a href="http://hi.baidu.com">???</a>??<a href="http://baike.baidu.com">???</a>??<a href="http://www.hao123.com">hao123</a><span> | <a href="/more/">???>></a></span></p><p id="lm"></p><p><a id="sh" onClick="this.setHomePage(‘http://www.baidu.com/‘)" href="http://utility.baidu.com/traf/click.php?id=215&url=http://www.baidu.com" onmousedown="return ns_c({‘fm‘:‘behs‘,‘tab‘:‘homepage‘,‘pos‘:0})">??????????</a></p><p id="lh"><a href="http://e.baidu.com/?refer=888">?????????</a> | <a href="http://top.baidu.com">?????????</a> | <a href="http://home.baidu.com">??????</a> | <a href="http://ir.baidu.com">About Baidu</a></p><p id="cp">&copy;2014 Baidu <a href="/duty/">??e??????</a> <a href="http://www.miibeian.gov.cn" target="_blank">??ICP?030173??</a> <img src="http://gimg.baidu.com/img/gs.gif"></p></div><map name="mp"><area shape="rect" coords="40,25,230,95"  href="http://hi.baidu.com/baidu/" target="_blank" title="?????? ??????" ></map></body>
<script>var w=window,d=document,n=navigator,k=d.f.wd,a=d.getElementById("nv").getElementsByTagName("a"),isIE=n.userAgent.indexOf("MSIE")!=-1&&!window.opera,sh=d.getElementById("sh");if(isIE&&sh&&!sh.isHomePage("http://www.baidu.com/")){sh.style.display="inline"}for(var i=0;i<a.length;i++){a[i].onclick=function(){if(k.value.length>0){var C=this,A=C.href,B=encodeURIComponent(k.value);if(A.indexOf("q=")!=-1){C.href=A.replace(/q=[^&$]*/,"q="+B)}else{this.href+="?q="+B}}}}(function(){if(/q=([^&]+)/.test(location.search)){k.value=decodeURIComponent(RegExp.$1)}})();if(n.cookieEnabled&&!/sug?=0/.test(d.cookie)){d.write(‘<script src=http://www.baidu.com/js/bdsug.js?v=1.0.3.0><\/script>‘)}function addEV(C,B,A){if(w.attachEvent){C.attachEvent("on"+B,A)}else{if(w.addEventListener){C.addEventListener(B,A,false)}}}function G(A){return d.getElementById(A)}function ns_c(E){var F=encodeURIComponent(window.document.location.href),D="",A="",B="",C=window["BD_PS_C"+(new Date()).getTime()]=new Image();for(v in E){A=E[v];D+=v+"="+A+"&"}B="&mu="+F;C.src="http://nsclick.baidu.com/v.gif?pid=201&pj=www&"+D+"path="+F+"&t="+new Date().getTime();return true}var bdimeHW={hasF:1};var imeTar="kw";var ime_t1=(new Date()).getTime();(function(){var M=G("mCon"),A=G("mMenu");var B=["????","??д","???"],O=["cl","hw","py"],D=["","http://www.baidu.com/hw/hwInput_1.1.js","http://www.baidu.com/olime/bdime.js"],N=[0,0,0];var L=n.cookieEnabled;if(L&&/\bbdime=(\d)/.test(d.cookie)){H(O[RegExp.$1],false)}var K=A.getElementsByTagName("a");for(var I=0;I<K.length;I++){K[I].onclick=F}if(isIE){var E=[];var P=M.getElementsByTagName("*");for(var I=0;I<P.length;I++){E.push(P[I])}E.push(M);var P=A.getElementsByTagName("*");for(var I=0;I<P.length;I++){E.push(P[I])}E.push(A);for(var I=0;I<E.length;I++){E[I].setAttribute("unselectable","on")}}function F(){ime_t1=(new Date()).getTime();var R=this.name.split("_")[1];try{if(w.bdime){bdime.control.closeIme()}}catch(Q){}H(R,true);return false}function H(V,Q){var T=0;if(V==O[1]){T=1;M.innerHTML=‘<span id="imeS" class="hw">‘+B[1]+"</span>";if(isIE){G("imeS").setAttribute("unselectable","on")}function S(){if(!N[1]){if(d.selection&&d.activeElement.id&&d.activeElement.id=="kw"){bdimeHW.hasF=1}bdimeHW.input=imeTar;bdimeHW.submit="su";J(D[1]);setTimeout(function(){if(typeof bdsug!="undefined"){bdsug.sug.initial()}},1000);N[1]=1}else{bdimeHW.reload(Q)}}if(Q){S()}else{addEV(G("imeS"),"click",S)}}else{if(V==O[2]){T=2;M.innerHTML="<span>"+B[2]+"</span>";if(!N[2]){J(D[2]);N[2]=1}else{try{if(w.bdime){bdime.control.openIme()}}catch(U){}}}else{M.innerHTML="<span>"+B[0]+"</span>"}}if(Q&&L){var R=new Date();R.setTime(R.getTime()+365*24*3600*1000);d.cookie="bdime="+T+";domain=baidu.com;path=/;expires="+R.toGMTString()}}function J(Q){if(Q){var R=d.createElement("script");R.src=Q;d.getElementsByTagName("head")[0].appendChild(R)}}function C(R){var R=R||window.event;var Q=R.target||R.srcElement;A.style.display=Q.id=="mCon"&&A.style.display!="block"?"block":"none"}addEV(d,"click",C)})();addEV(w,"load",function(){k.focus()});w.onunload=function(){};;</script>
<script type="text/javascript" src="http://www.baidu.com/cache/hps/js/hps-1.1.js"></script>
</html>

说明访问成功,想要扩展更加详细的使用方法,建议熟悉HTTP的协议!

使用它的好处是,当没有必要传递的参数,我们可以不需要传递,省流量;麻烦之处是,你需要深入了解Http的协议。

使用socket模拟Http请求

时间: 2024-10-16 09:40:42

使用socket模拟Http请求的相关文章

PHP+SOCKET 模拟HTTP请求

HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: POST .GET  .HEADE.  PUT.  TRACE  .DELETE .OPTIONS .CONNECT  (前三种最实用),有这麽多的请求方法,但web服务器不一定所有的都支持. GET   基本一致,请求指定的页面信息,并返回实体主体. HEAD  基本和GET一致 ,只不过返回的响

Python socket模拟HTTP请求

0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很奇怪的问题,对同一个URL,POST请求能正常返回信息,而一旦切到GET,socket time out. 伪代码如下: get_str = 'GET %s HTTP/1.1\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64)

python用socket模拟post请求

今天用python的socket模拟了下post请求,通过这个实例可以更加了解python中socket的使用,以及http请求和socket的相互关系等知识. #coding=utf-8 import socket if __name__=="__main__": s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("www.xxxxx.com",80)) #pyhon 字符串很长时可以

java socket模拟http请求

我们模拟SSLSocket连接,请求博客园首页,并打印响应消息.代码引用来自<Java网络编程精解>作者:孙卫琴 写这篇博客为了说明模拟过程中出现的一些问题,模拟时请先在浏览器访问目标路径,F12查看网络,查看原始的网络请求头. 注意: 1.HTTP请求报文包含请求行.请求头部.空行.请求包体4个部分组成. 2.模拟请求头部时Accept-Encoding不要使用压缩,否则响应结果会出现乱码 3.请求头部结束使用回车换行符结束 代码如下: package com.beluga.hello.ht

用socket 模拟http请求

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; class HttpHelper { #region 模拟客户端socket连接 private static Socket ConnectSocket(string server

PHP socket模拟POST请求

<?php if (! function_exists ( 'socket_post' )) { function socket_post($url, $data, $referer = '') { if (! is_array ( $data )) { return; } $data = http_build_query ( $data ); $url = parse_url ( $url ); if (empty ( $url ['scheme'] ) || $url ['scheme']

利用socket模拟http的混合表单上传(在一个请求中提交表单并上传多个文件)

在很多企业级应用中,我们都没法直接通过开发语言sdk包封装的http工具来模拟http复合表单(multipart/form-data),特别是在跨语言跨平台的编程过程中,其实实现方案并不复杂,只要你了解了http协议中复合表单的报文结构就很简单了: httpheader ------时间戳------ 表单参数1 ------时间戳------ 表单参数2 ------时间戳------ 文件1的描述+二进制信息 ------时间戳------ 文件2的描述+二进制信息 下面我们进一步以一段c

轻松把玩HttpAsyncClient之模拟post请求示例

如果看到过我前些天写过的<轻松把玩HttpClient之模拟post请求示例>这篇文章,你再看本文就是小菜一碟了,如果你顺便懂一些NIO,基本上是毫无压力了.因为HttpAsyncClient相对于HttpClient,就多了一个NIO,这也是为什么支持异步的原因. 不过我有一个疑问,虽说NIO是同步非阻塞IO,但是HttpAsyncClient提供了回调的机制,这点儿跟netty很像,所以可以模拟类似于AIO的效果.但是官网上的例子却基本上都是使用Future<HttpResponse

关于curl java 模拟http请求

近期笔者项目需求java模拟http请求,获取dns解析 tcp连接等详细耗时信息. java api中提供的urlConnection 及apache提供的httpClient都不能胜任该需求,二次开发太费时间.于是google之. 最后 得出两种解决办法: 一是使用HTTP4J. 该开源项目使用socket方式,模拟请求,记录时间戳,基本满足需求.对于header自定义等细节,可在此基础上比较方便的二次开发.只是,其中有一些bug需要修复, 如https链接时获取不到ssl时间等.使用该项目