|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
C#中有两处地方用到new关键字,第一处也是最常见的一处是用在调用构造函数的时候,这种情况也是大家见的最多的一种。另一处是用在派生类中,作用有隐藏成员,切断继承关系等,相信第二处的用法大家明显要比第一处生疏。visual|程序 收集代办署理程序的品种十分多,依据代办署理服务程序代办署理的协定分歧,分红HTTP代办署理服务程序、FTP代办署理服务程序等,运转代办署理服务程序的服务器也就称为HTTP代办署理服务器和FTP代办署理服务器。在本节中先容的Web代办署理服务程序代办署理的就是HTTP协定。
一.收集代办署理的范例及完成道理:
收集代办署理服务依据事情条理,一样平常可分为使用层代办署理、传输层代办署理和SOCKS代办署理。使用层代办署理是事情在TCP/IP参考模子的使用层之上,它撑持对使用层协定(如HTTP,FTP)的代办署理。它供应的把持最多,可是不天真,必需要有响应的协定撑持。假如协定不撑持代办署理(如SMTP和POP),那就只能在使用层以下代办署理,也即传输层代办署理。传输层代办署理间接与TCP层交互,加倍天真。请求代办署理服务用具有部分真正服务器的功效:监听特定TCP或UDP端口,吸收客户真个哀求同时向客户端收回响应的呼应。另外一种代办署理必要改动客户真个IP栈,即SOCKS代办署理。它是可用的最壮大、最天真的代办署理尺度协定。SOCKV4同意代办署理服务器外部的客户端完整地毗连到内部的服务器,SOCKV5增添了对客户真个受权和认证,因而它是一种平安性较高的代办署理。本节前面先容的代办署理是一种使用层下面的代办署理,所代办署理的协定是HTTP,也就是常常见到的Web代办署理。
收集代办署理就是一个毗连客户端(设定必要代办署理的盘算机)和服务器端(必要会见资本的服务器)的桥。要完成这类桥,收集代办署理就必需满意以下前提,实在也是代办署理服务的运转的流程:
(1).可以吸收并剖析客户真个哀求。
(2).创立到服务器的新毗连,并依据转发客户真个哀求信息。
(3).吸收服务器反应的信息。
(4).可以收回或注释服务器的呼应并将该呼应传回给客户端。
图01是收集代办署理服务的一个典范模子图:
图01:代办署理服务的模子
二.VisualC#完成Web代办署理服务程序
Web代办署理服务是代办署理服务中最经常使用的一种代办署理服务,依照代办署理服务的条理,它属于使用层代办署理,是对TCP/IP参考模子中的使用层的HTTP协定的代办署理。
Web代办署理服务也是代办署理服务中的一种,以是它也要满意代办署理服务的基础前提。鄙人面先容的代办署理服务程序中,是依照以下的按次来完成其功效的。
(1).代办署理服务器程序侦听端口,吸收客户端扫瞄器发送来的Web哀求信息。
(2).代办署理服务器程序吸收到客户端Web哀求信息后,剖析出Web服务器的地点,并创立一个Socket实例,并以此实例毗连Web服务器上。
(3).经由过程创立的Socket传送客户真个Web哀求数据包到Web服务器的80端口。
(4).代办署理服务器程序吸收Web服务器前往页面数据。
(5).代办署理服务器程序把吸收来的数据传送到客户端,完成Web代办署理。
因为客户真个对一个地点的扫瞄,要传送良多的Web哀求信息,为了更快、更正确的处置这些信息,Web代办署理服务程序接纳了多线程来处置每个Web哀求。仔细的读者大概会发明,处置每个客户真个Web哀求信息,代办署理服务器软件都要利用二个Socket,一个是用来吸收/传送客户机的信息,一个是和Web服务器举行交换。为了辨别这二个Socket,我们把他们都定名,和服务器对话的Socket,称为服务Socket;和客户端呆板对话的Scoket,称为客户Socket。
上面就入手下手Web代办署理服务程序的编写事情。
这个示例次要包括三个部份内容:
・创立一个Web代办署理类。
・Web代办署理服务的类的实例化。
・怎样经由过程这个Web代办署理类的实例完成Web代办署理服务。
上面就是第一部分的详细的完成步骤。
(一).创立一个Web代办署理类
以下是详细的操纵步骤以下:
1.起首启动VisualStudio.Net,顺次选择"文件"、"新建"、"项目"菜单后,在弹出"新建项目"对话框中将"项目范例"设置为"VisualC#项目",将"模板"设置为"Windows使用程序",在"称号"文本框中输出"WebProxy",在"地位"的文本框中输出"E:VS.NET项目",然后单击"断定"按钮。如许在"E:VS.NET项目"目次中就创立了一个新称号为"WebProxy"文件夹,内里寄存的就是"WebProxy"的项目文件。
2.选择菜单【项目】|【增加类】,弹出【增加新项】对话框
3.将【模板】设置【类】
4.在【称号】文本框中输出【Proxy】,单击【翻开】按钮,详细如图02所示。
图02:Web代办署理项目中【增加新项】对话框
5.在【办理计划资本办理器】窗口中,双击Proxy.cs文件,进进Proxy.cs文件的编纂界面。
6.在Proxy.cs源文件的开首,增加以下代码,以下代码是导进Proxy.cs中要利用到的定名空间:
usingSystem;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text;
usingSystem.IO; 7.用以下机关函数替换默许的机关函数。上面的代码是在Proxy类中创立一个机关函数。Proxy类只要一个机关函数,而且这个机关函数只要一个参数,这个参数是Socket工具,它次要用来和客户端举行数据互换,是一个客户Socket.。
publicProxy(Socketsocket)
{
//
//TODO:在此处增加机关函数逻辑
//
this.clientSocket=socket;
}
8.创立Proxy类中的Run办法,Run办法是Proxy类中独一的办法。其功效是从客户端吸收HTTP哀求,并传送到Web服务器,然后从Web服务器吸收反应来的数据,并传送到客户端。为了完成这二个分歧方面的数据传送,Run办法中是经由过程二个Socket实例来完成的。在编写Run办法的时分,要注重上面几点:
(1).因为HTTP是TCP/IP参考模子中的使用层协定,它创建于TCP协定之上,以是创立的Socket实例利用的协定范例应当为TCP协定。上面代码是创立能够传送HTTP哀求命令到Web服务器和吸收来自Web服务器反应来信息的Socket实例:
SocketIPsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
(2).别的一个Socket是在代办署理服务程序侦听端标语,吸收挂起的毗连哀求时分失掉的,以此Socket为参数,使用Proxy类中的机关函数,来创立一个Proxy实例的。此Socket完成从客户端吸收HTTP哀求信息,并传送数据到客户端。
Socket创立和利用是完成Web代办署理软件的关头,详细完成办法是在机关函数代码前面,输出以下代码,创立Proxy类的Run办法:
publicvoidRun()
{
stringclientmessage="";
//寄存来自客户真个HTTP哀求字符串
stringURL="";
//寄存剖析出地点哀求信息
intbytes=ReadMessage(read,refclientSocket,refclientmessage);
if(bytes==0)
{
return;
}
intindex1=clientmessage.IndexOf();
intindex2=clientmessage.IndexOf(,index1+1);
if((index1==-1)||(index2==-1))
{
thrownewIOException();
}
stringpart1=clientmessage.Substring(index1+1,index2-index1);
intindex3=part1.IndexOf(/,index1+8);
intindex4=part1.IndexOf(,index1+8);
intindex5=index4-index3;
URL=part1.Substring(index1+4,(part1.Length-index5)-8);
try
{
IPHostEntryIPHost=Dns.Resolve(URL);
Console.WriteLine("远程主机名:"+IPHost.HostName);
string[]aliases=IPHost.Aliases;
IPAddress[]address=IPHost.AddressList;
Console.WriteLine("Web服务器IP地点:"+address[0]);
//剖析出要会见的服务器地点
IPEndPointipEndpoint=newIPEndPoint(address[0],80);
SocketIPsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//创立毗连Web服务器真个Socket工具
IPsocket.Connect(ipEndpoint);
//Socket连Web接服务器
if(IPsocket.Connected)
Console.WriteLine("Socket准确毗连!");
stringGET=clientmessage;
Byte[]ByteGet=ASCII.GetBytes(GET);
IPsocket.Send(ByteGet,ByteGet.Length,0);
//代办署理会见软件对服务器端传送HTTP哀求命令
Int32rBytes=IPsocket.Receive(RecvBytes,RecvBytes.Length,0);
//代办署理会见软件吸收来自Web服务器真个反应信息
Console.WriteLine("吸收字节数:"+rBytes.ToString());
StringstrRetPage=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);
//代办署理服务软件往客户端传送吸收到的信息
}
catch(Exceptionexc2)
{
Console.WriteLine(exc2.ToString());
}
}
//吸收客户真个HTTP哀求数据
privateintReadMessage(byte[]ByteArray,refSockets,refStringclientmessage)
{
intbytes=s.Receive(ByteArray,1024,0);
stringmessagefromclient=Encoding.ASCII.GetString(ByteArray);
clientmessage=(String)messagefromclient;
returnbytes;
}
//传送从Web服务器反应的数据到客户端
privatevoidSendMessage(Sockets,stringmessage)
{
Buffer=newByte[message.Length+1];
intlength=ASCII.GetBytes(message,0,message.Length,Buffer,0);
Console.WriteLine("传送字节数:"+length.ToString());
s.Send(Buffer,length,0);
}
9.在界说Proxy类代码区中到场以下代码,以下代码是界说Proxy类中的利用的一些变量,这些变量次要是在前面的界说Run办法中利用。
SocketclientSocket;
Byte[]read=newbyte[1024];
//界说一个空间,存储来自客户端哀求数据包
Byte[]Buffer=null;
EncodingASCII=Encoding.ASCII;
//设定编码
Byte[]RecvBytes=newByte[4096];
//界说一个空间,存储Web服务器前往的数据
10.至此,Proxy类的界说历程就完成了。把Proxy类实例化十分复杂,和之前用的其他完整一样,详细语法以下:
publicProxy(Socketsocket);
参数:socket为一个Scoket实例
上面代码是创立一个Proxy实例:
Proxyproxy=newProxy(socket); (二).使用Proxy类,完成Web代办署理的详细示例:
上面是使用下面创立的Proxy类,完成Web代办署理程序的详细完成步骤,Proxy类被界说在定名空间WebProxy中。
1.在VisualStudio.Net的代码编纂器中翻开Class1.cs文件,进进Class1.cs的代码编纂界面。
2.在Class1.cs源文件的开首导进以下定名空间:
usingSystem;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text;
usingSystem.IO;
usingSystem.Threading;
usingWebProxy;
//个中定名空间WebProxy是Proxy类所处的地位,详细能够参阅Proxy.cs源文件
//中定名空间的界说。
3.在Main函数中增加以下代码,以下代码是使用Proxy类,来完成Web代办署理程序。
constintport=8000;
//界说端标语
TcpListenertcplistener=newTcpListener(port);
Console.WriteLine("侦听端标语:"+port.ToString());
tcplistener.Start();
//侦听端标语
while(true)
{
Socketsocket=tcplistener.AcceptSocket();
//并猎取传送和吸收数据的Scoket实例
Proxyproxy=newProxy(socket);
//Proxy类实例化
Threadthread=newThread(newThreadStart(proxy.Run));
//创立线程
thread.Start();
//启动线程
}
保留下面的一切步骤,如许一个复杂Web代办署理程序就算是完成了。此Web代办署理程序侦听的是8000端标语。
(三).测试Web代码程序:
Web代办署理程序要经由过程二台盘算机才干够完成。个中的一台盘算机运转Web代办署理程序,充任Web代办署理服务器。别的一台盘算机充任客户机,经由过程Web代办署理服务器来扫瞄网页。在断定Web代办署理软件运转后,上面是对客户机举行需要的设置。
1.翻开IE扫瞄器。
2.选择【工具】|【Internet选项】,弹出【Internet选项】对话框。在此对话框当选择【毗连】页面,单击个中的【局域网设置】按钮。弹出【局域网(LAN)设置】对话框。选择【为LAN利用代办署理服务器(X),(这些设置不会使用于拨号和VPN毗连)】多选框。并在个中的【地点】文本框中输出代办署理服务器的IP地点,因为测试的代办署理服务器的IP地点为"10.138.198.213",一切也输出此IP地点,在【端口】文本框中输出"8000"。详细如图03所示:
图03:客户端设定Web代办署理服务器对话框
此时客户真个设置就完成了,在断定IP地点为"10.138.198.213"的这台盘算机已运转下面先容的Web代办署理程序后。翻开客户真个IE扫瞄器,并输出要扫瞄的网址,就能够经由过程Web代办署理服务器来扫瞄网页了,图04是Web代办署理服务程序在服务器端运转时的界面。
图04:Web代办署理服务程序在服务器真个运转界面
四.总结:
至此一个复杂的Web代办署理服务软件就算基础完成了,经由过程下面内容的先容可见,固然代办署理服务的完成道理绝对复杂,但详细完成实在仍是很烦琐的。收集代办署理是一个内容丰厚,完成庞大的论题,本节先容的代办署理服务软件,不管在完成的协定品种,仍是完成的功效,都只能算很小的一部分。但愿列位可以经由过程本文的先容,分离其他相干的常识,制造出功效更壮大、平安性更高,利用更不乱的收集代办署理服务程序来。对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。 |
|