仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 796|回复: 8
打印 上一主题 下一主题

[学习教程] NET网页编程之C#收集编程系列专题三:自界说Web服务器

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:20:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
c++是语言,其实C++和java的应用范围根本就不一样的。在java应用的领域内,c++是不合适的。所以微软才搞了C#和Java对抗。媒介:
经由后面的专题中对收集层协定和HTTP协定的复杂先容信任人人对收集中的协定有了大抵的懂得的,本专题将针对HTTP协定界说一个Web服务器,我们寻常扫瞄网页经由过程在扫瞄器中输出一个网址就能够看到我们想要的网页,这个过程当中扫瞄器只是一个客户端,扫瞄器(使用层使用程序)经由过程HTTP协定把用户哀求发送到服务端,服务器承受到发送来的HTTP哀求,然后对哀求举行处置和呼应,最初把呼应的内容发送给客户端(扫瞄器这里充任了用户代办署理的客户端),扫瞄器再对承受到的呼应内容(通常为HTML文件)举行注释而且显现出来。这就是一次完全的用户哀求/呼应模子,本专题所报告的是一个复杂的Web服务器,其他一些年夜型的Web服务器(IIS,Apache)也是如许的一个道理,本专题只是复杂报告Web服务器的完成道理。

1、Socket编程完成一个复杂的Web服务器
Socket这个观点是在Unix体系中提出来的。在Unix的时期,为懂得决传输层的编程成绩,Unix供应了相似于文件操纵的收集操纵体例——Socket,经由过程Socket,我们就能够像操纵文件一样经由过程翻开、写进、读取、封闭等操纵完成收集编程,如许就使得收集编程能够一致到文件操纵方面,如许就使我们更简单地编写收集使用程序。必要注重的是,使用层的协定必要收集程序专门处置,Socket不卖力使用层协定,仅仅卖力传输层的协定。

如今先容下收集端标语(port)的观点,在统一个收集地点中,为了辨别利用不异协定的分歧使用程序,为分歧的使用程序分派一个数字编号,我们把这个编号就成为收集端标语(就是辨别统一个收集地点中分歧的历程)。端标语是由一个两个字节的整数,以是取值局限为0~65535,这些端标语又分为三类:
1.第一类的局限是0~1023,称为尽人皆知的端口,这些端标语由特定的收集程序利用,比方,TCP协定利用80端口来完成Http协定的传输。
2.第二类的局限是1024~49151,称为挂号端口,一样平常情形下不该该在程序中利用。
3.第三类的局限是49152~65535,称为公有端口,这些端口能够由一般用户程序利用。
在我们用Socket开辟收集使用程序中,另有一个就是端点的观点,在收集中,经由过程IP地点,协定和端标语能够独一地断定收集上的一个使用程序,个中把IP地点和端口的组合叫做端点(EndPoint)。每一个Socket必要绑定到一个端点上与其他端点举行通讯。

先容完基础的一些观点后,上面演示经由过程Socket编程完成一个复杂的Web服务器,此实例中就是复杂向扫瞄器前往一个流动的静态页面,完成代码以下:
usingSystem;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text;

namespaceWebServer
{
///<summary>
///完成一个复杂的Web服务器
///该服务器向哀求的扫瞄器前往一个静态的HTML页面
///</summary>
classProgram
{
staticvoidMain(string[]args)
{
//取得本机的Ip地点,即127.0.0.1
IPAddresslocaladdress=IPAddress.Loopback;

//创立能够会见的断点,49155暗示端标语,假如这里设置为0,暗示利用一个由体系分派的余暇的端标语
IPEndPointendpoint=newIPEndPoint(localaddress,49155);

//创立Socket工具,利用IPv4地点,数据通讯范例为数据流,传输把持协定TCP协定.
Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

//将Socket绑定到断点上
socket.Bind(endpoint);
//设置毗连行列的长度
socket.Listen(10);

while(true)
{
Console.WriteLine("WaitanconnectRequest...");
//入手下手监听,这个办法会梗塞线程的实行,直到承受到一个客户真个毗连哀求
Socketclientsocket=socket.Accept();

//输入客户真个地点
Console.WriteLine("ClientAddressis:{0}",clientsocket.RemoteEndPoint);
//把客户真个哀求数据读进保留到一个数组中
byte[]buffer=newbyte[2048];

intreceivelength=clientsocket.Receive(buffer,2048,SocketFlags.None);
stringrequeststring=Encoding.UTF8.GetString(buffer,0,receivelength);

//在服务器端输入哀求的动静
Console.WriteLine(requeststring);

//服务器端做出响应内容
//呼应的形态行
stringstatusLine="HTTP/1.1200OK
";
byte[]responseStatusLineBytes=Encoding.UTF8.GetBytes(statusLine);
stringresponseBody="<html><head><title>DefaultPage</title></head><body><pstyle=font:bold;font-size:24pt>Welcomeyou</p></body></html>";
stringresponseHeader=
string.Format(
"Content-Type:text/html;charset=UTf-8
Content-Length:{0}
",responseBody.Length);

byte[]responseHeaderBytes=Encoding.UTF8.GetBytes(responseHeader);
byte[]responseBodyBytes=Encoding.UTF8.GetBytes(responseBody);

//向客户端发送形态行
clientsocket.Send(responseStatusLineBytes);

//向客户端发送回应头信息
clientsocket.Send(responseHeaderBytes);

//发送头部和内容的空行
clientsocket.Send(newbyte[]{13,10});

//想客户端发送主体部分
clientsocket.Send(responseBodyBytes);

//断开毗连
clientsocket.Close();
Console.ReadKey();
break;
}

//封闭服务器
socket.Close();

}
}
}

运转了局:
起首运转服务端后的界面:


在扫瞄器中输出http://localhost:49155/则扫瞄器能够看到以下的所示的了局:


此时在服务器端显现的输入为:


这里只是复杂完成了一个web服务器的功效,固然实践的Web服务器经由过程用户的发来的Http哀求中取得哀求文件范例,哀求文件名和哀求目次等信息,然后Web服务器依据这些哀求信息从服务器的物理目次中寻觅哀求的文件,假如在服务器中找到哀求的文件,然后服务器把呼应内容发送给客户端。这里只是经由过程这个复杂的Web服务器让人人了解哀求/呼应模子和Web服务器的事情道理,一些庞大的Web服务器也是在此基本举行一些其他功效的扩大。

2、基于TcpListener的Web服务器
在.net平台下,为了简化收集编程,.net对套接字又举行了一次封装,封装后的类是在System.Net.Sockets定名空间下的TcpListener类和TcpClient类,利用TcpListener类用来监听和吸收传进的毗连哀求,在该类的机关函数中只必要传送一组收集端点信息就能够筹办好监听参数,而不必要设置利用的收集协定等细节,挪用Start办法后,监听事情就入手下手(直接挪用了Socket.Listen办法),AcceptTcpClient办法将堵塞历程,直到一个客户端发来毗连哀求为止,这个办法前往一个封装了Socket的TcpClient工具,同时从传进的毗连行列中删除该客户真个毗连哀求。此时经由过程这个TcpClient工具与客户端举行通讯。

上面是基于TcpListener和TcpClient的一个复杂的Web服务器的代码:
usingSystem;
usingSystem.Net;
usingSystem.Net.Sockets;
usingSystem.Text;

namespaceTcpWebserver
{
classProgram
{
staticvoidMain(string[]args)
{
//取得本机的Ip地点,即127.0.0.1
IPAddresslocaladdress=IPAddress.Loopback;

//创立能够会见的断点,49155暗示端标语,假如这里设置为0,暗示利用一个由体系分派的余暇的端标语
IPEndPointendpoint=newIPEndPoint(localaddress,49155);

//创立Tcp监听器
TcpListenertcpListener=newTcpListener(endpoint);

//启动监听
tcpListener.Start();
Console.WriteLine("WaitanconnectRequest...");
while(true)
{
//守候客户毗连
TcpClientclient=tcpListener.AcceptTcpClient();
if(client.Connected==true)
{
//输入已创建毗连
Console.WriteLine("Createdconnection");
}

//取得一个收集流工具
//该收集流工具封装了Socket的输出和输入操纵
//此时经由过程对收集流工具举行写进来前往呼应动静
//经由过程对收集流工具举行读取来取得哀求动静
NetworkStreamnetstream=client.GetStream();
//把客户真个哀求数据读进保留到一个数组中
byte[]buffer=newbyte[2048];

intreceivelength=netstream.Read(buffer,0,2048);
stringrequeststring=Encoding.UTF8.GetString(buffer,0,receivelength);

//在服务器端输入哀求的动静
Console.WriteLine(requeststring);

//服务器端做出响应内容
//呼应的形态行
stringstatusLine="HTTP/1.1200OK
";
byte[]responseStatusLineBytes=Encoding.UTF8.GetBytes(statusLine);
stringresponseBody="<html><head><title>DefaultPage</title></head><body><pstyle=font:bold;font-size:24pt>Welcomeyou</p></body></html>";
stringresponseHeader=
string.Format(
"Content-Type:text/html;charset=UTf-8
Content-Length:{0}
",responseBody.Length);

byte[]responseHeaderBytes=Encoding.UTF8.GetBytes(responseHeader);
byte[]responseBodyBytes=Encoding.UTF8.GetBytes(responseBody);

//写进形态行信息
netstream.Write(responseStatusLineBytes,0,responseStatusLineBytes.Length);
//写进回应的头部
netstream.Write(responseHeaderBytes,0,responseHeaderBytes.Length);
//写进回应头部和内容之间的空行
netstream.Write(newbyte[]{13,10},0,2);

//写进回应的内容
netstream.Write(responseBodyBytes,0,responseBodyBytes.Length);

//封闭与客户真个毗连
client.Close();
Console.ReadKey();
break;
}

//封闭服务器
tcpListener.Stop();
}
}
}

程序的输入了局和后面的用Socket完成的效果不异,这里就不再贴图了,这里完成的Web服务器都是创建把持台的使用程序来完成的,感乐趣的伴侣也能够用Windows窗体举行完成,同时这里也只是复杂列出了接纳同步的体例举行完成的,同时TcpListener类和TcpClient类同时撑持异步操纵的办法,上面列出这个两个类中异步操纵的办法以下表:
类办法申明TcpListenerBeginAcceptTcpClient入手下手一个异步操纵承受一个传进的毗连EndAcceptTcpClient异步承受传进的毗连,并创立新的TcpClient工具来处置客户真个通讯TcpClientBeginConnect入手下手一个对远程主机毗连的异步哀求EndConnect异步承受传进的毗连实验。

3、总结
到这里这篇文章就差未几先容到这里了,本专题是先容怎样自界说一个复杂Web服务器,经由过程这个专题但愿人人能够对Web服务器的事情历程有一个复杂的懂得。

别的在这个专题内里我们是用IE扫瞄器举行发送客户哀求的,以是前面专题将先容自界说一个扫瞄器,经由过程我们自界说的扫瞄器来对Web服务器发送哀求,然后在本人自界说的扫瞄器中把呼应动静显现出来。感觉很多控件都必须自己去写代码;用了WebMatrix感觉也不是很好,毕竟没有很强的WYSIWYG效果。现在就不知道如何是好了。
再现理想 该用户已被删除
沙发
发表于 2015-1-18 13:10:16 | 只看该作者
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-1-26 14:43:56 | 只看该作者
目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
飘灵儿 该用户已被删除
地板
发表于 2015-2-4 20:11:01 | 只看该作者
主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。
再见西城 该用户已被删除
5#
发表于 2015-2-10 06:47:33 | 只看该作者
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-3-1 03:18:21 | 只看该作者
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
冷月葬花魂 该用户已被删除
7#
发表于 2015-3-10 12:42:46 | 只看该作者
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。
透明 该用户已被删除
8#
发表于 2015-3-17 07:12:34 | 只看该作者
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
小魔女 该用户已被删除
9#
发表于 2015-3-24 02:22:52 | 只看该作者
HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-6-16 00:13

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表