首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

!一个简单的http协议服务

2012-04-12 
求助!一个简单的http协议服务这几天在弄一个简单的http代理:就是获取本地浏览器发出的http请求从中提取Hos

求助!一个简单的http协议服务
这几天在弄一个简单的http代理:就是获取本地浏览器发出的http请求从中提取Host然后在重新建个socket与远程web服务器通信并把web服务器的响应数据通过这个程序发送给浏览器,让浏览器显示出网页。代码如下

C# code
/*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);        }    } 


C# code
/*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();            }        }    }}

出现的问题是一直网页打不开,并且终端下只是答应出的服务器回应的一部分如下
 
但是调试的过程中却出现不一样的情况:
 
终端输出如下:
 
希望各位给指点指点啊,谢谢拉
 


[解决办法]
.net有封装好的HttpListener,可以保证正确处理。不用使用TcpListener。

热点排行