求助!一个简单的http协议服务
这几天在弄一个简单的http代理:就是获取本地浏览器发出的http请求从中提取Host然后在重新建个socket与远程web服务器通信并把web服务器的响应数据通过这个程序发送给浏览器,让浏览器显示出网页。代码如下
/*proxy.cs*/using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.IO;using GetHttp;namespace WebProxy{ class Proxy { public Proxy(Socket socket) { this.clientSocket = socket; } Socket clientSocket; Byte[] read = new byte[1024]; //定义一个空间,存储来自客户端请求数据包 Byte[] Buffer = null; Encoding ASCII = Encoding.ASCII; //设定编码 Byte[] RecvBytes = new Byte[1024]; //定义一个空间,存储Web服务器返回的数据 //Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); public void Run() { string clientmessage = ""; //存放来自客户端的HTTP请求字符串 string URL = ""; //存放解析出地址请求信息 //int bytes = ReadMessage(read, ref clientSocket, ref clientmessage); ReadMessage(read, ref clientSocket, ref clientmessage); Byte[] ReadBrower = Encoding.ASCII.GetBytes(clientmessage); if (clientmessage.Length == 0||clientmessage == null) { return; } int index1 = clientmessage.IndexOf(' '); int index2 = clientmessage.IndexOf(' ', index1 + 1); if ((index1 == -1) || (index2 == -1)) { throw new IOException(); } string part1 = clientmessage.Substring(index1 + 1, index2 - index1); int index3 = part1.IndexOf('/', index1 + 8); int index4 = part1.IndexOf(' ', index1 + 8); int index5 = index4 - index3; URL = part1.Substring(index1 + 4, (part1.Length - index5) - 8); //---------------------------------------------- //GetHttp.GetHttp http = new GetHttp.GetHttp(); //string Host = http.GetHost(clientmessage); //string Method = http.GetMethod(clientmessage); //string Url = http.URL(clientmessage); //string Version = (http.HttpVersion(clientmessage)) ? "HTTP/1.1" : "HTTP/1.0"; //string Connection = http.GetConnection(clientmessage); //string Accept = http.GetAccept(clientmessage); //string Accept_Language = http.GetAccept_Language(clientmessage); //string Accept_Encoding = http.GetAccept_Encoding(clientmessage); //string User_Agent = http.GetUser_Agent(clientmessage); //string Send_Message_Web = Method + " " + Url + " " + Version + "\r\n" // + "Host: " + Host + "\r\n" // + "Accept: " + Accept + "\r\n" // + "Accept-Language: " + Accept_Language + "\r\n" // + "User-Agent: " + User_Agent + "\r\n" // + "Accept-Encoding: " + Accept_Encoding + "\r\n" // + "Connection: " + Connection + "\r\n" // + "\r\n"; //---------------------------------------- try { Console.WriteLine(URL); IPHostEntry IPHost = Dns.GetHostEntry(URL); Console.WriteLine("远程主机名: " + IPHost.HostName); string[] aliases = IPHost.Aliases; IPAddress[] address = IPHost.AddressList; Console.WriteLine("Web服务器IP地址:" + address[0]); //解析出要访问的服务器地址 IPEndPoint ipEndpoint = new IPEndPoint(address[0], 80); Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建连接Web服务器端的Socket对象 IPsocket.Connect(ipEndpoint); //Socket连Web接服务器 if (IPsocket.Connected) Console.WriteLine("Socket 正确连接!"); //string GET = clientmessage; //Byte[] ByteGet = ASCII.GetBytes(GET); // string request = "GET / HTTP/1.1\r\nHost: " + URL + //"\r\nConnection: Close\r\n\r\n"; // Byte[] bytesSent = Encoding.ASCII.GetBytes(request); // IPsocket.Send(bytesSent,bytesSent.Length, 0); //IPsocket.Send(read, read.Length, 0); IPsocket.Send(ReadBrower,ReadBrower.Length,0); //代理访问软件对服务器端传送HTTP请求命令 //Int32 rBytes = 0; //Int32 all_rBytes = 0; //代理访问软件接收来自Web服务器端的反馈信息 //String strRetPage = null; //do //{ // rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0); // all_rBytes+=rBytes; // Console.WriteLine("接收字节数:" + rBytes.ToString()); // strRetPage = strRetPage + Encoding.ASCII.GetString(RecvBytes, 0, rBytes); //} while (rBytes > 0); //Console.WriteLine("接收字节数:{0}" + all_rBytes); Console.WriteLine("--------------------------------------------------"); NetworkStream myNetworkStream = new NetworkStream(IPsocket); StringBuilder myCompleteMessage = new StringBuilder(); if (myNetworkStream.CanRead) { byte[] myReadBuffer = new byte[1024]; int numberOfBytesRead = 0; // Incoming message may be larger than the buffer size. do{ numberOfBytesRead = myNetworkStream.Read(myReadBuffer, 0, myReadBuffer.Length); Console.WriteLine("has read:{0}",numberOfBytesRead); myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)); }while(myNetworkStream.DataAvailable); // Print out the received message to the console. Console.WriteLine("You received the following message : " + myCompleteMessage.ToString()); } Console.WriteLine("-------------------------------------------------------"); SendMessage(clientSocket, myCompleteMessage.ToString()); IPsocket.Shutdown(SocketShutdown.Both); IPsocket.Close(); //代理服务软件往客户端传送接收到的信息 } catch (Exception exc2) { Console.WriteLine(exc2.ToString()); } } //接收客户端的HTTP请求数据 private void ReadMessage(byte[] ByteArray, ref Socket s, ref String clientmessage) { //int bytes=0; //int all_bytes=0; //do{ // bytes = s.Receive(ByteArray, ByteArray.Length, 0); // all_bytes += bytes; // clientmessage += Encoding.ASCII.GetString(ByteArray,0,bytes); // }while(bytes>0); // return all_bytes; //---------------------------- //int bytes = s.Receive(ByteArray, 1024, 0); //string messagefromclient = Encoding.ASCII.GetString(ByteArray); //clientmessage = (String)messagefromclient; //return bytes; NetworkStream MyNetStream = new NetworkStream(s); StringBuilder Message = new StringBuilder(); int bytes; if (MyNetStream.CanRead) { do { bytes = MyNetStream.Read(ByteArray, 0, ByteArray.Length); Message.AppendFormat("{0}", Encoding.ASCII.GetString(ByteArray, 0, bytes)); } while (MyNetStream.DataAvailable); }else{ Console.WriteLine("Cnanot receved message from A brower!"); } clientmessage=Message.ToString(); } //传送从Web服务器反馈的数据到客户端 private void SendMessage(Socket s, string message) { Buffer = new Byte[message.Length + 1]; int length = ASCII.GetBytes(message, 0, message.Length, Buffer, 0); Console.WriteLine("传送字节数:" + length.ToString()); s.Send(Buffer, length, 0); } }
/*Program.cs*/using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.IO;using System.Threading;using WebProxy;namespace WebProxy{ class Program { static void Main(string[] args) { const int port = 8000; IPAddress localAddr = IPAddress.Parse("192.168.1.101"); //定义端口号 TcpListener tcplistener = new TcpListener(localAddr,port); Console.WriteLine("侦听端口号: " + port.ToString()); tcplistener.Start(); //侦听端口号 while (true) { Socket socket = tcplistener.AcceptSocket(); //并获取传送和接收数据的Scoket实例 Proxy proxy = new Proxy(socket); proxy.Run(); } } }}