一段完整的Socket HTTP协议中 GET报文的应用

适合刚接触socket和http的人

注释比较全面

方法的返回数据是我为了方便调用并取得调用结果的

如果不需要可以去掉

GETHTML方法返回的数据就是取得的网页HTML代码

可以利用字符串拆分 /r/n/r/n 注意是两个哦

分出报头和内容

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Net.Sockets;
  5. using System.Net;
  6. using System.IO;
  7. namespace 贴吧江湖
  8. {
  9.     public class clsSocket
  10.     {
  11.         private Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建socket 连接
  12.         IPHostEntry IpHost;
  13.         public int CreatSocket(string strUrl, int intPort)
  14.         {
  15.             try
  16.             {
  17.                 IpHost = Dns.Resolve(strUrl);//解析主机地址
  18.             }
  19.             catch (Exception)
  20.             {
  21.                 return 5;
  22.             }
  23.             IPAddress ip = IpHost.AddressList[0];       //获取主机IP
  24.             IPEndPoint ipe = new IPEndPoint(ip, intPort);   //创建IPEndPoint实例
  25.             try
  26.             {
  27.                 s.Connect(ipe);//尝试连接 
  28.             }
  29.             catch (ArgumentNullException ae) //处理参数为空引用异常  
  30.             {
  31.                 Console.WriteLine("ArgumentNullException : {0}", ae.ToString());
  32.                 return 1;
  33.             }
  34.             catch (SocketException se) //处理操作系统异常  
  35.             {
  36.                 Console.WriteLine("SocketException : {0}", se.ToString());
  37.                 return 2;
  38.             }
  39.             catch (Exception es)
  40.             {
  41.                 Console.WriteLine("Unexpected exception : {0}", es.ToString());
  42.                 return 3;
  43.             }
  44.             return 0;
  45.         }
  46.         public string GetHtml()
  47.         {
  48.             string sendStr = "GET /bbs/ HTTP/1.1/r/n";
  49.             sendStr += "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*/r/n";
  50.             sendStr += "Accept-Language: zh-cn/r/n";
  51.             sendStr += "Host: " + IpHost.HostName + "/r/n";
  52.             sendStr += "Connection: Keep-Alive/r/n/r/n";//创建报文头
  53.             byte[] bytesSendStr = new byte[1024];// 创建bytes字节数组以转换发送串  
  54.             bytesSendStr = Encoding.ASCII.GetBytes(sendStr); //将发送内容字符串转换成字节byte数组 
  55.             try
  56.             {
  57.                 s.Send(bytesSendStr, bytesSendStr.Length, 0);//向主机发送请求 
  58.             }
  59.             catch (Exception ce)
  60.             {
  61.                 return ce.Message;
  62.             }
  63.             string recvStr = ""//声明接收返回内容的字符串  
  64.             byte[] recvBytes = new byte[1024];//声明字节数组,一次接收数据的长度为1024字节
  65.             int bytes = 0;//返回实际接收内容的字节数,循环读取,直到接收完所有数据
  66.             while (true)
  67.             {
  68.                 bytes = s.Receive(recvBytes, recvBytes.Length, 0);
  69.                 if (bytes <= 0)//读取完成后退出循环 
  70.                     break;
  71.            
  72.                 Encoding gb2312 = Encoding.GetEncoding("gb2312");//将读取的字节数转换为字符串  
  73.                 recvStr += gb2312.GetString(recvBytes, 0, bytes);
  74.             }
  75.       
  76.             return recvStr;
  77.         }
  78.         public void CloseSocket()
  79.         {
  80.             s.Shutdown(SocketShutdown.Both);
  81.             s.Close();
  82.         }
  83.     }
  84. }

 

写入文本的代码

 

  1.   //将所读取的字符串转换为字节数组 
  2.     byte[] content = Encoding.ASCII.GetBytes(recvStr);
  3.     try
  4.     {
  5.         //创建文件流对象实例 
  6.         FileStream fs = new FileStream("fileName.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
  7.         //写入文件 
  8.         fs.Write(content, 0, content.Length);
  9.     }
  10.     catch (Exception fe)
  11.     {
  12.         MessageBox.Show("文件创建/写入错误:" + fe.Message, "提示信息", MessageBoxButtons.RetryCancel, MessageBoxIcon.Information);
  13.     }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章