通常我们爬虫不知道对方的ip,只知道它们的url,先把客户端代码修改如下:

    public string Get(string url, params Encoding[] encoding){string responseText = string.Empty;_statu = HttpRequestStatus.Busy;try{Regex reg = new Regex("(http://)?(?<name>[^/?]+)");Match m = reg.Match(url);var hostName = m.Groups["name"].Value;IPHostEntry hosts = Dns.GetHostByName(hostName);if (!url.StartsWith("http://"))url = "http://" + hostName + "/";if (!url.EndsWith("/"))url += "/";IPEndPoint ipPoint = new IPEndPoint(hosts.AddressList[0], 80);Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
                socket.Connect(ipPoint);///向服务器发送信息//{GET /index.php HTTP/1.0Content-Type: application/x-www-form-urlencodedStringBuilder bufRequest = new StringBuilder();bufRequest.Append("GET ").Append(url).Append(" HTTP/1.0\r\n");bufRequest.Append("Content-Type: application/x-www-form-urlencoded\r\n");bufRequest.Append("\r\n");string requestContent = bufRequest.ToString();byte[] bs = Encoding.ASCII.GetBytes(requestContent);socket.Send(bs);//发送信息/**////接受从服务器返回的信息byte[] recvBytes = new byte[1024];int bytes;Encoding coder = Encoding.UTF8;if (encoding.Count() > 0){coder = encoding[0];}do{bytes = socket.Receive(recvBytes, recvBytes.Length, 0);responseText += coder.GetString(recvBytes, 0, bytes);} while (bytes != 0);/**////一定记着用完socket后要关闭
                socket.Close();}catch (Exception ex){}return responseText;}

以上是用socket同步的方式来实现的,以下是异步方式

public class StateObject:IDisposable{public Socket workSocket = null;public const int BufferSize = 256;public byte[] buffer = new byte[BufferSize];// public StringBuilder sb = new StringBuilder();public MemoryStream Stream = new MemoryStream();public string header = null;public static Encoding Encoding = Encoding.UTF8;public Action<Stream> HandAction;public void Dispose(){if (workSocket != null){workSocket.Shutdown(SocketShutdown.Both);workSocket.Close();}}}public class AsynchronousClient:IDisposable{public StateObject State { set; get; }public void StartClient(IPEndPoint ipPoint, string data, Action<Stream> actionHandle){try{//IPHostEntry ipHostInfo = Dns.Resolve("host.contoso.com");//IPAddress ipAddress = ipHostInfo.AddressList[0];//IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);StateObject state = new StateObject();state.workSocket = client;state.header = data;state.HandAction = actionHandle;State = state;// state.header = "GET "+data+" HTTP/1.1";client.BeginConnect(ipPoint, new AsyncCallback(ConnectCallback), state);}catch { }}void ConnectCallback(IAsyncResult ar){StateObject state = (StateObject)ar.AsyncState;Socket client = state.workSocket;client.EndConnect(ar);Trace.WriteLine(string.Format("Socket connected to {0}", client.RemoteEndPoint.ToString()));byte[] byteData = StateObject.Encoding.GetBytes(state.header);// 开始发送数据到远程设备.  client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), state);}void SendCallback(IAsyncResult ar){StateObject state = (StateObject)ar.AsyncState;Socket client = state.workSocket;// 完成数据发送.  int bytesSent = client.EndSend(ar);Trace.WriteLine(string.Format("Sent {0} bytes to server.", bytesSent.ToString()));try{//byte[] recvBytes = new byte[1024];//int bytes;//string responseText = string.Empty;//do//{//    bytes = client.Receive(recvBytes, recvBytes.Length, 0);//    responseText += StateObject.Encoding.GetString(recvBytes, 0, bytes);//} while (bytes != 0);  client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);}catch (Exception ex) { }}void ReceiveCallback(IAsyncResult ar){// 从输入参数异步state对象中获取state和socket对象  StateObject state = (StateObject)ar.AsyncState;Socket client = state.workSocket;//从远程设备读取数据  int bytesRead = client.EndReceive(ar);if (bytesRead > 0){// 有数据,存储.  //  state.sb.Append(StateObject.Encoding.GetString(state.buffer, 0, bytesRead));state.Stream.Write(state.buffer, 0, bytesRead);// 继续读取.  client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);}else{client.Shutdown(SocketShutdown.Both);client.Close();client = null;//state.HandAction.Invoke(state.sb.ToString());
                state.HandAction(state.Stream);}}public void Dispose(){State.Dispose();}}

调用方式:

     IPEndPoint ipPoint = new IPEndPoint(hosts.AddressList[0], 80);AsynchronousClient client = new AsynchronousClient();string responseText = string.Empty;string requestText=string.Empty;// = "GET " + url + " HTTP/1.0 \r\n Content-Type: application/x-www-form-urlencoded";StringBuilder bufRequest = new StringBuilder();bufRequest.Append("GET ").Append(url).Append(" HTTP/1.0\r\n");bufRequest.Append("Content-Type: application/x-www-form-urlencoded\r\n");bufRequest.Append("\r\n");requestText = bufRequest.ToString();if (!string.IsNullOrEmpty(header))requestText += header;client.StartClient(ipPoint, requestText, new Action<Stream>(x =>{byte[] recvBytes = new byte[1024];int bytes;Encoding coder = Encoding.UTF8;x.Seek(0, SeekOrigin.Begin);do{bytes =x.Read(recvBytes,0, recvBytes.Length);responseText += Encoding.UTF8.GetString(recvBytes, 0, bytes);} while (bytes != 0);client.Dispose();}));

用socket来代替HttpWebRequest和HttpWebResponse相关推荐

  1. C#模拟POST提交表单(二)--HttpWebRequest以及HttpWebResponse

    上次介绍了用WebClient的方式提交POST请求,这次,我继续来介绍用其它一种方式 HttpWebRequest以及HttpWebResponse 自认为与上次介绍的WebClient最大的不同之 ...

  2. 使用Moles框架实现HttpWebRequest与HttpWebResponse的单元测试

    有时程序使用HttpWebRequest与HttpWebResponse实现HTTP的访问,但我们想测试它们不太容易实现.现在我们可以使用Moles框架来实现对它的单元测试.如果您还不了解Moles, ...

  3. HttpWebRequest与HttpWebResponse进行数据采集时的注意点

    一般的数据采集使用WebClient可以很方便的进行,但是一些比较复杂(指需要较多的设置请求标头,以及重定向)的采集一般会使用HttpWebRequest或HttpWebResponse. 在需要给当 ...

  4. C# -- HttpWebRequest 和 HttpWebResponse 的使用

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebRequest 和 HttpWebResponse,来判断一个网页地址是否可以正常访问. 1 ...

  5. HttpWebRequest以及HttpWebResponse

    上次介绍了用WebClient的方式提交POST请求,这次,我继续来介绍用其它一种方式 HttpWebRequest以及HttpWebResponse 自认为与上次介绍的WebClient最大的不同之 ...

  6. 利用HttpWebRequest和HttpWebResponse做黑客注射工具

    利用HttpWebRequest和HttpWebResponse做黑客注射工具. using System; using System.Collections.Generic; using Syste ...

  7. C#使用HttpWebRequest和HttpWebResponse上传文件示例

    C#使用HttpWebRequest和HttpWebResponse上传文件示例 1.HttpHelper类: 复制内容到剪贴板程序代码 using System; using System.Coll ...

  8. C#利用HttpWebRequest、HttpWebResponse调用12306接口,实现登录、查票、买票。

    [免责申明]本文只为学习使用,若有用作商业.其他行为,与本人无关. 使用工具 - UI bootstrap - 后台C# - 插件 datetimepicker.js,select.js UI界面效果 ...

  9. 利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录

    之前看过某个同学的一篇有关与使用JSoup解析学校图书馆的文章,仔细一看,发现竟然是同校!!既然对方用的是java,那么我也就来个C#好了,虽然我的入门语言是java. C#没有JSoup这样方便的东 ...

最新文章

  1. Quartz分布式实现
  2. Qt中QtTableWidget的使用
  3. MySQL索引背后的数据结构及算法原理zz
  4. R语言进阶 | 变量赋值背后的机制与R语言内存优化
  5. 用apksigner进行批量签名的脚本
  6. Makefile中几种赋值
  7. JVM内存的那些事,你了解多少?
  8. 从 C++98 到 C++17,元编程是如何演进的? | 技术头条
  9. SQL Server 中的 JSON 数据
  10. 纽微特荒唐事:都知道是找人顶罪,竟没人敢指正
  11. openxml sdk java_使用OpenXML SDK创建文档时,OpenXML Powertools HtmlConverter失败
  12. 专访雪球网技术团队:用Node.js做前端的类SOA架构
  13. K. 冒险公社 (线性DP)
  14. 优先使用组合而不使用继承
  15. python实现火车票查询_火车票查询(python版)
  16. 网站seo淘宝客不能做了?我是怎么用网站做淘客月入过万的
  17. 面试经历---YY欢聚时代
  18. 流动时代消费链路离散化下广告设计的衍变方向【学习笔记】
  19. 人脸扫描Canvas动画
  20. Muti-scale related papers

热门文章

  1. go语言结构体标签的意义
  2. php调用restful接口_如何使用PHP编写RESTful接口
  3. python调用webservice接口实例_python调用各种接口,webservice,c接口,com接口,socket协议方法...
  4. 将矩阵转为一行_初等变换不会改变矩阵的秩
  5. 3.9 训练一个 Softmax 分类器
  6. C语言 FileStreaming 键盘与屏幕IO
  7. 字符集ASCII、GBK、UNICODE、UTF在储存字符时的区别
  8. 太原锦华计算机学校教学质量怎样,一所好学校有哪些特点?
  9. VMware ESXi 6.X Syslog日志配置
  10. 网络介绍 > 网络连接 > 混合云网络