C# 使用socket访问网页

C#用socket请求网页。

封装类:

public class WebLib{
		public enum MethodType{
			getMethod,
			postMethod
		}
		public struct Rtn{
			public Int16 Code;
			public string Message;
			public string Parameters;
		}
		private Rtn rtn = new Rtn();
		private Socket? socket;
		public string url = "";
		public string host = "";
		public UInt16 port = 80;
		
		public String cookie = "";
		public String referer = "";
		public String postData = "";
		public MethodType methodType;
		public string result = "";
		public string contentType = "application/x-www-form-urlencoded";
		public string uag ="application/x-www-form-urlencoded\"\r\n\tPublic uag As String = \"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Mobile Safari/537.36";
		public WebLib(){
			rtn.Code = 0;
			rtn.Message = "unknown";
		}
		public void WebRequest(){
			Thread t1 = new Thread(web_request);
			t1.IsBackground = true;
			t1.Start();
			t1.Join();
		}
		private void web_request() {
			postData = "";
			string ipStr = this.getIP(host);
			if(ipStr != "") {
				Rtn connect = this.connect(ipStr, port);
				if (connect.Code > 0){
					this.SendData();
				} else {
					Debug.Print("连接失败了,原因为:" + connect.Message);
				}
			} else{
				Debug.Print("无法得到服务器IP地址");
			}
		}

		private Rtn connect(string ip, UInt16 port) {
			socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//使用指定的地址簇协议、套接字类型和通信协议
			if(socket == null){
				rtn.Code = -1;
				rtn.Message = "连接不上";
				rtn.Parameters=("ip" + ip + ",port=" + port.ToString());
			}
			IPAddress ipaddr = IPAddress.Parse(ip);
			IPEndPoint endPoint = new IPEndPoint(ipaddr, port); // 用指定的ip和端口号初始化IPEndPoint实例
			try{
				socket.Connect(endPoint);
				rtn.Code = 1;
				rtn.Message = "恭喜,连接成功";
			} catch(Exception e){
				rtn.Code = -2;
				rtn.Message = e.Message;
			}
			return rtn;
		}
		private void ReceiveData(){
			byte[] finalbyte = Array.Empty<byte>();
			string recvStr;
			byte[] recvBytes = new byte[8192];
			int bytes;
			while(true) {
				bytes = socket.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
				if(bytes > 0){
					Debug.Print("bytes=" + bytes);
					byte[] data_tmp = new byte[bytes];
					Array.Copy(recvBytes, 0, data_tmp, 0, bytes);
					finalbyte = JoinArr(finalbyte, data_tmp);
				} else {
					Debug.Print ("recv_complete");
					recvStr = Encoding.UTF8.GetString(finalbyte);
					result = recvStr;
					break;
				}
			}
		}
		private void SendData() {
			Thread c_thread = new Thread(ReceiveData);
			c_thread.IsBackground = true;
			c_thread.Start();
			if(methodType == MethodType.getMethod) {
				string Data = "GET " + url + " HTTP/1.0" + "\n" +
					"Cookie: " + cookie  + "\n" +
					"User-Agent: " + uag + "\n" +
					"Host: " + host + "\n" + "\n" +
					"Accept-Encoding: gzip, deflate" + "\n" +
					"Accept-Language: en-US" + "\n" +
					"Referer: " + referer;
				Byte[] byteArray = Encoding.Default.GetBytes (Data);
				if(socket != null) {
					Debug.Print("sending");
					socket.Send(byteArray);
				}
			}
			c_thread.Join();
		}

		private byte[] JoinArr(byte[] a, byte[] b) {
			byte[] byteFinal;
			byteFinal = new byte[a.Length + b.Length];
			Array.Copy(a, 0, byteFinal, 0, a.Length);
			Array.Copy(b, 0, byteFinal, a.Length, b.Length);
			return byteFinal;
		}

		public string getIP(string host) {
			try {
				IPHostEntry IpEntry = Dns.GetHostEntry(host);
				for(int i = 0; i < IpEntry.AddressList.Length; i++) {
					//AddressFamily.InterNetwork=IPv4,AddressFamily.InterNetworkV6=IPv6
					if(IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork) {
						return IpEntry.AddressList[i].ToString();
					}
				}
			} catch(Exception) {
				
			}
			return "";
		}
	}

调用方法:

public static void Main(string[] args) {
			WebLib obj = new WebLib ();
			obj.host = "这是域名";
			obj.url = "/这里是要访问的地址。去掉域名剩下的";
			obj.port = 80;
			obj.methodType = WebLib.MethodType.getMethod;
			obj.WebRequest();
			Debug.Print("result=" + obj.result);//这是最终结果
		}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值