




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C# 网络编程系列专题三:自定义Web服务器(转载: /zhili/archive/2012/08/23/WebServer.html )前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网络中的协议有了大致的了解的, 本专题将针对HTTP协议定义一个Web服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到我们想要的网页,这个过程中浏览器只是一个客户端,浏览器(应用层应用程序)通过HTTP协议把用户请求发送到服务端, 服务器接受到发送来的HTTP请求,然后对请求进行处理和响应,最后把响应的内容发送给客户端(浏览器这里充当了用户代理的客户端),浏览器再对接受到的响应内容(一般是HTML文件)进行解释并且显示出来。这就是一次完整的用户请求/响应模型,本专题所讲述的是一个简单的Web服务器,其他一些大型的Web服务器(IIS,Apache)也是这样的一个原理, 本专题只是简单讲述Web服务器的实现原理。 一、Socket编程实现一个简单的Web服务器 Socket这个概念是在Unix系统中提出来的。在Unix的时代,为了解决传输层的编程问题,Unix提供了类似于文件操作的网络操作方式Socket,通过Socket,我们就可以像操作文件一样通过打开、写入、读取、关闭等操作完成网络编程,这样就使得网络编程可以统一到文件操作方面,这样就使我们更容易地编写网络应用程序。需要注意的是,应用层的协议需要网络程序专门处理,Socket不负责应用层协议,仅仅负责传输层的协议。 现在介绍下网络端口号(port)的概念,在同一个网络地址中,为了区分使用相同协议的不同应用程序,为不同的应用程序分配一个数字编号,我们把这个编号就成为网络端口号(就是区分同一个网络地址中不同的进程)。端口号是由一个两个字节的整数,所以取值范围为065535,这些端口号又分为三类:1 第一类的范围是01023,称为众所周知的端口,这些端口号由特定的网络程序使用,例如,TCP协议使用80端口来完成Http协议的传输。2 第二类的范围是102449151,称为登记端口,一般情况下不应该在程序中使用。3 第三类的范围是4915265535,称为私有端口, 这些端口可以由普通用户程序使用。 在我们用Socket开发网络应用程序中,还有一个就是端点的概念,在网络中,通过IP地址,协议和端口号可以唯一地确定网络上的一个应用程序,其中把IP地址和端口的组合叫做端点(EndPoint)。每个Socket需要绑定到一个端点上与其他端点进行通信。 介绍完基本的一些概念后,下面演示通过Socket编程实现一个简单的Web服务器,此实例中就是简单向浏览器返回一个固定的静态页面,实现代码如下:using System;using System.Net;using System.Net.Sockets;using System.Text;namespace WebServer / / 实现一个简单的Web服务器 / 该服务器向请求的浏览器返回一个静态的HTML页面 / class Program static void Main(string args) / 获得本机的Ip地址,即 IPAddress localaddress =IPAddress.Loopback; / 创建可以访问的断点,49155表示端口号,如果这里设置为0,表示使用一个由系统分配的空闲的端口号 IPEndPoint endpoint = new IPEndPoint(localaddress,49155); / 创建Socket对象,使用IPv4地址,数据通信类型为数据流,传输控制协议TCP协议. Socket socket = new Socket ( AddressFamily.InterNetwork ,SocketType.Stream,ProtocolType.Tcp); /将Socket绑定到断点上 socket.Bind(endpoint); / 设置连接队列的长度 socket.Listen(10); while (true) Console.WriteLine(Wait an connect Request.); / 开始监听,这个方法会堵塞线程的执行,直到接受到一个客户端的连接请求 Socket clientsocket =socket.Accept(); / 输出客户端的地址 Console.WriteLine(Client Address is: 0, clientsocket.RemoteEndPoint); / 把客户端的请求数据读入保存到一个数组中 byte buffer =new byte2048; int receivelength = clientsocket.Receive(buffer, 2048, SocketFlags.None); string requeststring = Encoding.UTF8.GetString(buffer, 0, receivelength); / 在服务器端输出请求的消息 Console.WriteLine(requeststring); / 服务器端做出相应内容 / 响应的状态行 string statusLine =HTTP/1.1 200 OKrn; byte responseStatusLineBytes = Encoding.UTF8.GetBytes(statusLine); string responseBody = Default PageWelcome you; string responseHeader = string.Format( Content-Type: text/html; charset=UTf-8rnContent-Length: 0rn,responseBody.Length); byte responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader); byte responseBodyBytes = Encoding.UTF8.GetBytes(responseBody); / 向客户端发送状态行 clientsocket.Send(responseStatusLineBytes); / 向客户端发送回应头信息 clientsocket.Send(responseHeaderBytes); / 发送头部和内容的空行 clientsocket.Send(new byte 13, 10 ); / 想客户端发送主体部分 clientsocket.Send(responseBodyBytes); / 断开连接 clientsocket.Close(); Console.ReadKey(); break; / 关闭服务器 socket.Close(); 运行结果:首先,运行服务端后的界面:然后,在浏览器中输入http:/localhost:49155/ 后,则浏览器可以看到如下的所示的结果:此时,在服务器端显示的结果为:这里只是简单实现了一个web服务器的功能,当然实际的Web服务器通过用户的发来的Http请求中获得请求文件类型,请求文件名以及请求目录等信息,然后Web服务器根据这些请求信息从服务器的物理目录中寻找请求的文件,如果在服务器中找到请求的文件,然后服务器把响应内容发送给客户端。这里只是通过这个简单的Web服务器让大家理解请求/响应模型以及Web服务器的工作原理,一些复杂的Web服务器也是在此基础进行一些其他功能的扩展。二、基于TcpListener的Web服务器 在.net平台下, 为了简化网络编程,.net对套接字又进行了一次封装,封装后的类是在System.Net.Sockets命名空间下的TcpListener类和TcpClient类,使用TcpListener类用来监听和接收传入的连接请求,在该类的构造函数中只需要传递一组网络端点信息就可以准备好监听参数,而不需要设置使用的网络协议等细节,调用Start方法后,监听工作就开始(间接调用了Socket.Listen方法),AcceptTcpClient方法将阻塞进程,直到一个客户端发来连接请求为止,这个方法返回一个封装了Socket的TcpClient对象,同时从传入的连接队列中删除该客户端的连接请求。此时通过这个TcpClient对象与客户端进行通信。 下面是基于TcpListener和TcpClient的一个简单的Web服务器的代码:using System;using System.Net;using System.Net.Sockets;using System.Text;namespace TcpWebserver class Program static void Main(string args) / 获得本机的Ip地址,即 IPAddress localaddress =IPAddress.Loopback; / 创建可以访问的断点,49155表示端口号,如果这里设置为0,表示使用一个由系统分配的空闲的端口号 IPEndPoint endpoint = new IPEndPoint(localaddress, 49155); / 创建Tcp 监听器 TcpListener tcpListener = new TcpListener(endpoint); / 启动监听 tcpListener.Start(); Console.WriteLine(Wait an connect Request.); while (true) / 等待客户连接 TcpClient client =tcpListener.AcceptTcpClient(); if (client.Connected = true) / 输出已经建立连接 Console.WriteLine(Created connection); / 获得一个网络流对象 / 该网络流对象封装了Socket的输入和输出操作 / 此时通过对网络流对象进行写入来返回响应消息 / 通过对网络流对象进行读取来获得请求消息 NetworkStream netstream = client.GetStream(); / 把客户端的请求数据读入保存到一个数组中 byte buffer = new byte2048; int receivelength = netstream.Read(buffer, 0, 2048); string requeststring = Encoding.UTF8.GetString(buffer, 0, receivelength); / 在服务器端输出请求的消息 Console.WriteLine(requeststring); / 服务器端做出相应内容 / 响应的状态行 string statusLine = HTTP/1.1 200 OKrn; byte responseStatusLineBytes = Encoding.UTF8.GetBytes(statusLine); string responseBody = Default PageWelcome you; string responseHeader = string.Format( Content-Type: text/html; charset=UTf-8rnContent-Length: 0rn, 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(new byte 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开始一个对远程主机连接的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 济宁市2024-2025学年八年级上学期语文期末模拟试卷
- 集安市2025-2026学年七年级上学期语文月考模拟试卷
- 2025年度财务人员年度工作报告
- 电解铝生产安全知识培训课件
- 电表量程的选择课件
- 高血压糖尿病防治课件
- 电脑无法显示课件问题
- qhse管理体系考试及答案
- 电缆知识培训教材课件
- 电算化工资管理应用课件
- GB 21258-2024燃煤发电机组单位产品能源消耗限额
- DB34T 4379-2023 农村房地一体不动产确权登记技术规程
- 数字媒体艺术史全册完整教学课件
- 贵州珍酒酿酒有限公司招聘笔试题库2024
- 电力建设施工技术规范 第5部分:管道及系统-DLT 5190.5
- 《矿物岩石学教学课件》1-2 矿物学
- 《信号完整性测试》课件2
- DB6101T141-2018猕猴桃水肥一体化施肥技术规程
- 制造业绿色生产与环境可持续发展
- 中国石油天然气股份有限公司油气田站场目视化设计规定
- 园区光纤施工方案
评论
0/150
提交评论