适合刚接触socket和http的人
注释比较全面
方法的返回数据是我为了方便调用并取得调用结果的
如果不需要可以去掉
GETHTML方法返回的数据就是取得的网页HTML代码
可以利用字符串拆分 /r/n/r/n 注意是两个哦
分出报头和内容
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Net.Sockets;
- using System.Net;
- using System.IO;
- namespace 贴吧江湖
- {
- public class clsSocket
- {
- private Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建socket 连接
- IPHostEntry IpHost;
- public int CreatSocket(string strUrl, int intPort)
- {
- try
- {
- IpHost = Dns.Resolve(strUrl);//解析主机地址
- }
- catch (Exception)
- {
- return 5;
- }
- IPAddress ip = IpHost.AddressList[0]; //获取主机IP
- IPEndPoint ipe = new IPEndPoint(ip, intPort); //创建IPEndPoint实例
- try
- {
- s.Connect(ipe);//尝试连接
- }
- catch (ArgumentNullException ae) //处理参数为空引用异常
- {
- Console.WriteLine("ArgumentNullException : {0}", ae.ToString());
- return 1;
- }
- catch (SocketException se) //处理操作系统异常
- {
- Console.WriteLine("SocketException : {0}", se.ToString());
- return 2;
- }
- catch (Exception es)
- {
- Console.WriteLine("Unexpected exception : {0}", es.ToString());
- return 3;
- }
- return 0;
- }
- public string GetHtml()
- {
- string sendStr = "GET /bbs/ HTTP/1.1/r/n";
- 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";
- sendStr += "Accept-Language: zh-cn/r/n";
- sendStr += "Host: " + IpHost.HostName + "/r/n";
- sendStr += "Connection: Keep-Alive/r/n/r/n";//创建报文头
- byte[] bytesSendStr = new byte[1024];// 创建bytes字节数组以转换发送串
- bytesSendStr = Encoding.ASCII.GetBytes(sendStr); //将发送内容字符串转换成字节byte数组
- try
- {
- s.Send(bytesSendStr, bytesSendStr.Length, 0);//向主机发送请求
- }
- catch (Exception ce)
- {
- return ce.Message;
- }
- string recvStr = ""; //声明接收返回内容的字符串
- byte[] recvBytes = new byte[1024];//声明字节数组,一次接收数据的长度为1024字节
- int bytes = 0;//返回实际接收内容的字节数,循环读取,直到接收完所有数据
- while (true)
- {
- bytes = s.Receive(recvBytes, recvBytes.Length, 0);
- if (bytes <= 0)//读取完成后退出循环
- break;
- Encoding gb2312 = Encoding.GetEncoding("gb2312");//将读取的字节数转换为字符串
- recvStr += gb2312.GetString(recvBytes, 0, bytes);
- }
- return recvStr;
- }
- public void CloseSocket()
- {
- s.Shutdown(SocketShutdown.Both);
- s.Close();
- }
- }
- }
写入文本的代码
- //将所读取的字符串转换为字节数组
- byte[] content = Encoding.ASCII.GetBytes(recvStr);
- try
- {
- //创建文件流对象实例
- FileStream fs = new FileStream("fileName.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
- //写入文件
- fs.Write(content, 0, content.Length);
- }
- catch (Exception fe)
- {
- MessageBox.Show("文件创建/写入错误:" + fe.Message, "提示信息", MessageBoxButtons.RetryCancel, MessageBoxIcon.Information);
- }