C#網(wǎng)絡(luò)編程之十二——實現(xiàn)Web代理功能 [page_break] 8.在定義Proxy類代碼區(qū)中加入下列代碼,下列代碼是定義Proxy類中的使用的一些變量,這些變量主要是在后面的定義Run方法中使用。 Socket clientSocket; Byte[] read = new byte[1024]; //定義一個空間,存儲來自客戶端請求數(shù)據(jù)包 Byte [] Buffer = null; Encoding ASCII = Encoding.ASCII; //設(shè)定編碼 Byte[] RecvBytes = new Byte[4096]; //定義一個空間,存儲Web服務(wù)器返回的數(shù)據(jù) 9.創(chuàng)建Proxy類中的Run方法。Run方法是Proxy類中唯一的方法。其功能是從客戶端接收HTTP請求,并傳送到Web服務(wù)器,然后從Web服務(wù)器接收反饋來的數(shù)據(jù),并傳送到客戶端。為了實現(xiàn)這二個不同方面的數(shù)據(jù)傳送,Run方法中是通過兩個Socket實例來實現(xiàn)的。在編寫Run方法的時候,要注意下面兩點: (1)由于HTTP建立于TCP協(xié)議之上,所以創(chuàng)建的Socket實例應(yīng)該使用TCP協(xié)議。下面代碼是創(chuàng)建可以傳送HTTP請求命令到Web服務(wù)器和接收來自Web服務(wù)器反饋來信息的Socket實例: Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); (2)另外一個Socket是在代理服務(wù)程序偵聽端口號,接收連接請求時候得到的,所以應(yīng)該以此Socket為參數(shù),利用Proxy類中的構(gòu)造函數(shù)來創(chuàng)建一個Proxy實例。此Socket實現(xiàn)從客戶端接收HTTP請求信息,并傳送數(shù)據(jù)到客戶端。 Socket創(chuàng)建和使用是實現(xiàn)Web代理軟件的關(guān)鍵。在構(gòu)造函數(shù)代碼后面,輸入下列代碼: public void Run() { string clientmessage = " " ; //存放來自客戶端的HTTP請求字符串 string URL = " " ; //存放解析出地址請求信息 int bytes = ReadMessage(read, ref clientSocket, ref clientmessage); if (bytes == 0) { 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); try { IPHostEntry IPHost = Dns.Resolve(URL); Console.WriteLine("遠程主機名: " + IPHost.HostName); string [] aliases = IPHost.Aliases; IPAddress[] address = IPHost.AddressList; Console.WriteLine("Web服務(wù)器IP地址:" + address[0]); //解析出要訪問的服務(wù)器地址 IPEndPoint ipEndpoint = new IPEndPoint(address[0], 80); Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //創(chuàng)建連接Web服務(wù)器端的Socket對象 IPsocket.Connect(ipEndpoint); //Socket連Web接服務(wù)器 if (IPsocket.Connected) Console.WriteLine("Socket 正確連接!"); string GET = clientmessage; Byte[] ByteGet = ASCII.GetBytes(GET); IPsocket.Send(ByteGet, ByteGet.Length, 0); //代理訪問軟件對服務(wù)器端傳送HTTP請求命令 Int32 rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0); //代理訪問軟件接收來自Web服務(wù)器端的反饋信息 Console.WriteLine("接收字節(jié)數(shù):" + rBytes.ToString()); String strRetPage = null; strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes); while (rBytes > 0) { rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0); strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes); } IPsocket.Shutdown(SocketShutdown.Both); IPsocket.Close(); SendMessage(clientSocket, strRetPage); //代理服務(wù)軟件往客戶端傳送接收到的信息 } catch (Exception exc2) { Console.WriteLine(exc2.ToString()); } } //接收客戶端的HTTP請求數(shù)據(jù) private int ReadMessage(byte [] ByteArray, ref Socket s, ref String clientmessage) { int bytes = s.Receive(ByteArray, 1024, 0); string messagefromclient = Encoding.ASCII.GetString(ByteArray); clientmessage = (String)messagefromclient; return bytes; } //傳送從Web服務(wù)器反饋的數(shù)據(jù)到客戶端 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("傳送字節(jié)數(shù):" + length.ToString()); s.Send(Buffer, length, 0); } 至此,Proxy類的定義過程就完成了。 |
溫馨提示:喜歡本站的話,請收藏一下本站!