TCPIP课程设计报告_第1页
TCPIP课程设计报告_第2页
TCPIP课程设计报告_第3页
TCPIP课程设计报告_第4页
TCPIP课程设计报告_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、重庆科技学院 XXXX设计课程设计报告 学 院: 电气与信息工程学院_ 专业班级: 计科普10-02 学生姓名: 唐柳 学 号: 201044189 设计地点(单位)_ _I520_ _ _ 设计题目: WEB服务器 完成日期: 2013 年1月12日 指导教师评语: _ _ _ 成绩(五级记分制):_ _ 指导教师(签字):_ _ 26摘要本专题将针对HTTP协议定义一个Web服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到我们想要的网页,这个过程中浏览器只是一个客户端,浏览器(应用层应用程序)通过HTTP协议把用户请求发送到服务端, 服务器接受到发送来的HTTP请求,然后对请求

2、进行处理和响应,最后把响应的内容发送给客户端(浏览器这里充当了用户代理的客户端),浏览器再对接受到的响应内容(一般是HTML文件)进行解释并且显示出来。这就是一次完整的用户请求/响应模型,本专题所讲述的是一个简单的Web服务器,其他一些大型的Web服务器(IIS,Apache)也是这样的一个原理, 本专题只是简单讲述Web服务器的实现原理。关键字:HTTP协议 客户端 web服务器目录1.概要11.1 C#软件实现原理11.2 HTTP协议的作用原理12.界面设计32.1 服务器界面32.2 服务器界面控件33.实现流程54.服务器编程64.1 设计HTTP web服务器64.1.1创建Tcp

3、Listener对象64.1.2接受客户端请求64.1.3读取请求内容75.测试web服务器135.1 实验准备135.1.1 创建文件夹135.1.2 保存测试网页及图片135.2 访问web服务器虚拟目录下的网页和图片155.2.1访问网页显示不全面155.2.2 访问网页中的图片165.2.3 访问网页正常165.3 访问网页错误信息186.C#安装软件设计197.总结23致谢24参考文献251.概要一个 Web 服务器也被称为 HTTP 服务器,它通过 HTTP 协议与客户端通信。这个客户端通常指的是Web浏览器。1.1 C#软件实现原理C#实现WEB服务器、HTTP协议的作用原理:W

4、WW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。1.2 HTTP协议的作用原理HTTP协议的作用原理包括四个步骤:1)连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。2)请求:Web浏览器通过socket向Web

5、服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:GET 路径/文件名 HTTP/1.0。文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。3)应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。例:假设客户机与www.17:8080/cq.htm建立了连接,就会发送GET命令:GET cq.htm HTTP/1.0。主机名为17的We

6、b服务器从它的文档空间中搜索子目录的文件cq.htm。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。为了告知 Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。常用的HTTP头信息有: HTTP 1.0 200 OK:这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。代码“200 OK”表示请求完成。 MIME_Version:1.0:它指示MIME类型的版本。 content_type:类型:这个头信息非常重要,它指示HTTP体信息的MIME

7、类型。如:content_type:text/html指示传送的数据是HTML文档。 content_length:长度值:它指示HTTP体信息的长度(字节)。4)关闭连接:当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。2.界面设计2.1 服务器界面作为服务器,即使是GUI界面,也应当简洁为好。本程序将服务器配置功能以图形方式提供,但对于服务运行过程中的状态监控,仍旧采用字符显示方式。本次使用了一个ListBox列表控件,将它的背景设置为黑色,并将其设置成为不可选择,以模拟Dos命令行效果。界面显示如下图所示;图 2.1 界面显示2.2 服

8、务器界面控件软件工程名为“MyWebServer”,程序界面上个控件的属性描述如下表所示:表 1-1 web服务器界面控件描述名称控件类型功能描述frmWebServerForm程序主窗体listBoxStatusViewListBox服务状态控制栏tbxWebServerIpTextBox填写服务IP地址tbxWebServerPortTextBox填写服务端口号tbxWebRootTextBox设置填写根目录btnStartStopButton服务“启动/停止”按钮3.实现流程使用TcpListener类的方法实现,流程如下图所示。(1)首先web服务器以TcpListener类建立服务器

9、socket,对某个端口进行监听,实验中的端口号是8080,以等待客户端连接该端口。(2)处理客户端的连接:建立客户端连接,可以使用TcpListener类的AcceptSocket方法或者是AcceptTcpClient方法。AcceptSocket方法可以接受客户端的请求,并且建立与客户端的连接的Socket。(3)处理完数据传送或接受:使用Socket类的Send与Receive方法传输及接受数据。(4)完毕时,关闭web浏览器和web服务器的Socket连接。图 3.1 web服务器实现流程4.服务器编程4.1 设计HTTP web服务器4.1.1创建TcpListener对象(1)开

10、始监听端口 InstanceLst=new TcpListener(IPAddress.Parse(tbxWebServerIp.Text),int.Parse(tbxWebServerPort.Text); InstanceLst.Start();(2)同时启动一个监听进程”StartListen“ ListTh = new Thread(new ThreadStart(StartListen); ListTh.Start();(3)其中,IstanceLst是TcpListener类的对象,ListTh是监听线程,它们的定义如下: private TcpListener InstanceL

11、st = null; private Thread ListTh;4.1.2接受客户端请求while (true) Socket mySocket = InstanceLst.AcceptSocket(); listBoxStatusView.Items.Add("Socket 类型:" + mySocket.SocketType); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; if (mySocket.Connected) listBoxStatusView.Items.Add("

12、;客户端连接 IP" + mySocket.RemoteEndPoint.ToString(); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; ./读取请求内容,返回数据 mySocket.Close(); 这里用InstanceLst对象的AcceptSocket()方法接受客户端的请求,并且建立于客户端连接的Socket(mySocket)。4.1.3读取请求内容(1)在连接成功后,服务器取得web浏览器的HTTP请求,使用Socket类的Receive方法取得该请求。代码如下:Byte bRece

13、ive = new byte1024;try int i = mySocket.Receive(bReceive, bReceive.Length, 0); catch (Exception e) listBoxStatusView.Items.Add(e.ToString(); break; (2)转换成字符串类型,服务器将取得的HTTP请求内容转换成字符串,存储在缓冲区sBuffer中,以便下面处理。 string sBuffer = Encoding.ASCII.GetString(bReceive);(3)HTTP协议本身比较复杂,只处理简单客户请求的GET方法,该方法是客户端请求下载

14、web网页的方法,是最常用的。对GET请求进行处理代码如下:1)只处理 “GET”请求类型if (sBuffer.Substring(0, 3) != "GET") listBoxStatusView.Items.Add("只处理”GET“请求类型!");mySocket.Close(); return; 2)查找”HTTP“的位置 iStartPos = sBuffer.IndexOf("HTTP", 1); string sHttpVersion = sBuffer.Substring(iStartPos, 8);3)得到请求类型

15、和文件目录文件名 sRequest = sBuffer.Substring(0, iStartPos - 1); sRequest.Replace("", "/");4)如果结尾不是文件名也不是以”/”结尾,则加“/“ if (sRequest.IndexOf(".") < 1) && (!sRequest.EndsWith("/") sRequest = sRequest + "/" 5)得到请求文件名 iStartPos = sRequest.LastIndexOf(&

16、quot;/") + 1; sRequestedFile = sRequest.Substring(iStartPos);6)得到请求文件目录 sDirName = sRequest.Substring(sRequest.IndexOf("/"), sRequest.LastIndexOf("/") - 3);经过上面的处理,web服务器从HTTP请求报文中,解析出客户端想要浏览资源的文件名和其所在目录。(4)默认这个文件所在目录就是用户在软件界面的“根目录”一栏所填写的路径,也就是服务器的程序代码中定义的虚拟目录,而这里我们注重的一点就是我在

17、寻找路径的时候,是寻找当前路径,这样对我们来说方便很多。代码如下所示:1)获取虚拟目录物理路径sLocalDir = sMyWebServerRoot;listBoxStatusView.Items.Add("请求文件目录:" + sLocalDir);listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; if (sLocalDir.Length = 0) sErrorMessaage = "<H2>错误!请求目录不存在<H2><Br>" Sen

18、dHeader(sHttpVersion, "", sErrorMessaage.Length, "404 Not Found", ref mySocket); SendToBrowser(sErrorMessaage, ref mySocket); mySocket.Close(); continue; if (sRequestedFile.Length = 0) /取得请求文件名 sRequestedFile = "index.html" 2)取得请求文件类型(设定为text/html) String sMimeType = &q

19、uot;text/html" sPhysicalFilePath = sLocalDir + sRequestedFile; listBoxStatusView.Items.Add("请求文件:" + sPhysicalFilePath); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; if (File.Exists(sPhysicalFilePath) = false) sErrorMessaage = "<H2>404 Error!File Does Not

20、 Exits.<H2>" SendHeader(sHttpVersion, "", sErrorMessaage.Length, "404 Not Found", ref mySocket); SendToBrowser(sErrorMessaage, ref mySocket); listBoxStatusView.Items.Add(sFormattedMessage); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; else int iTotBy

21、tes = 0; sRequest = "" FileStream fs = new FileStream(sPhysicalFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryReader reader = new BinaryReader(fs); byte bytes = new bytefs.Length; int read; while (read = reader.Read(bytes, 0, bytes.Length) != 0) sResponse = sResponse + En

22、coding.ASCII.GetString(bytes, 0, read); iTotBytes = iTotBytes + read; reader.Close(); fs.Close(); SendHeader(sHttpVersion, sMimeType, iTotBytes, "200 ok", ref mySocket); SendToBrowser(bytes, ref mySocket); 处理结束后,向客户端返回响应数据。(5)如上面的代码所示,视处理结果向客户端浏览器发送出不同的响应。1)如果客户请求的文件不存在,则返回错误信息。if (File.Ex

23、ists(sPhysicalFilePath) = false) sErrorMessaage = "<H2>404 Error!File Does Not Exits.<H2>" SendHeader(sHttpVersion, "", sErrorMessaage.Length, "404 Not Found", ref mySocket); SendToBrowser(sErrorMessaage, ref mySocket); listBoxStatusView.Items.Add(sFormatted

24、Message); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; 2)如果文件存在,则返回网页内容至客户端web浏览器,代码如下所示。else int iTotBytes = 0; sRequest = "" FileStream fs = new FileStream(sPhysicalFilePath, FileMode.Open, FileAccess.Read, FileShare.Read); BinaryReader reader = new BinaryReader(fs); b

25、yte bytes = new bytefs.Length; int read; while (read = reader.Read(bytes, 0, bytes.Length) != 0) sResponse = sResponse + Encoding.ASCII.GetString(bytes, 0, read); iTotBytes = iTotBytes + read; reader.Close(); fs.Close(); SendHeader(sHttpVersion, sMimeType, iTotBytes, "200 ok", ref mySocket

26、); SendToBrowser(bytes, ref mySocket); 由上述程序可以看出,web服务器响应客户端是分两步动作完成的:(6)返回HTTP响应头,用SendHeader()方法。所有HTTP响应头的第一行都是状态行,该行内容依次是当前HTTP版本号,3位数字组成的状态码,以及描述状态的短语,各项之间用空格分隔。状态行之后是标头信息。一般情况下,服务器会返回一个名为Data的标头,表示响应生成的日期与时间,同时服务器还可能会返回一些关于自身的信息。接下来两个标头是Content-Type和Content-Length。再返回信息中,首部Content-Type指定了MIME类

27、和HTML(text/html),编码类型是GB2312。下面代码就是用SendHeader()方法给响应头个字段赋值。/HTTP响应头 public void SendHeader(string sHttpVersion, string sMIMEHeader, int iTotBytes, string sStatusCode, ref Socket mySocket) String sBuffer = "" if (sMIMEHeader.Length = 0) sMIMEHeader = "text/html" / 默认 text/html sB

28、uffer = sBuffer + sHttpVersion + sStatusCode + "rn" sBuffer = sBuffer + "Server: cx1193719-brn" sBuffer = sBuffer + "Content-Type: " + sMIMEHeader + "rn" sBuffer = sBuffer + "Accept-Ranges: bytesrn" sBuffer = sBuffer + "Content-Length: " +

29、iTotBytes + "rnrn" Byte bSendData = Encoding.ASCII.GetBytes(sBuffer); SendToBrowser(bSendData, ref mySocket); listBoxStatusView.Items.Add("总字节:" + iTotBytes.ToString(); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; (7)返回响应数据(包含网页内容),用SendToBrowser()方法。HTTP响应数据。它

30、是web服务器向浏览器返回信息的主体部分,在不出错的条件下,它所包含的就是所请求资源的HTML源文件内容。对于客户端浏览器来说,它接收到HTTP响应后,会自动分析HTML源文件,然后将其显示出来,这就是通过浏览器看到的页面。下面代码就是用SendToBrowser()方法返回响应数据。/返回相应数据 public void SendToBrowser(String sData, ref Socket mySocket) SendToBrowser(Encoding.ASCII.GetBytes(sData), ref mySocket); public void SendToBrowser(B

31、yte bSendData, ref Socket mySocket) int numBytes = 0; try if (mySocket.Connected) if (numBytes = mySocket.Send(bSendData, bSendData.Length, 0) = -1) listBoxStatusView.Items.Add("Socket出错!无法发送数据包"); else listBoxStatusView.Items.Add("发送字节数" + numBytes.ToString(); listBoxStatusView.

32、TopIndex = listBoxStatusView.Items.Count - 1; else listBoxStatusView.Items.Add("连接失败!"); catch (Exception e) Console.WriteLine("发生错误:0", e.ToString(); 注意,这里并没有指明客户端使用的是那种请求类型,这是因为请求是客户端发出的,客户端自然知道每种类型的请求将返回什么样的数据,也知道如何处理服务器返回的数据,所以不需要服务器告述它响应的是那种类型的请求。5.测试web服务器5.1 实验准备5.1.1 创建文件

33、夹在web服务器编程中,我们已经指定web服务器的虚拟目录为“E:2012vs软件MyWebServerMyWebServerbinDebugMyWebServerRoot,所以我在E盘中新建了一个文件夹,取名为” MyWebServerRoot“,可是在程序中我的寻找路径,寻找当前目录,这样只是在实验中比较方便。而后面我在将程序制作成软件包后,我的文件路径就是 C:Program FilesMicrosoftSetup1MyWebServerRoot。新建文件夹如下图所示:图 5.1 web服务器测试目录5.1.2 保存测试网页及图片在接下来的实验中,就以这个新建的文件夹作为服务器的根目录,

34、用来存放测试用的各种资源。首先收集一些资源为下面进行的实验做准备。上网访问欢迎访问重庆科技学院教务在线!-信息简报重庆科技学院教务处网站(网址为图 5.2 保存重庆科技学院信息简报页面作为测试页面注意:在保存网页时,要命名为全英文字母的文件名,这里取名为cq.htm。之所以这样做是因为:我这个web服务器只能够处理字符串形式的文件名,还不能支持中文的文件名。要使用服务器程序支持中文文件名,就必须实现汉字处理功能,那样会极大的增加代码量。保存好网页后,顺便也将我们网页中所涉及到的图片都保存到根目录中去,最后在文件夹中显示的就是网页中所需要的图片,样式等资料。如下图所示。图 5.3 保存测试用的图

35、片5.2 访问web服务器虚拟目录下的网页和图片如果想要证明web服务器是确定无疑有效的,那么将外网断开,实验照样能够进行,这样就说明实验是成功的。5.2.1访问网页显示不全面启动web服务器程序MyWebServer,程序已经自动配置IP地址和端口号(17:0880本机地址),根目录E:2012vs软件MyWebServerMyWebServerbinDebugMyWebServerRoot这是放置测试资源的文件夹。现在单击启动按钮启动服务器程序如下图所示:5.4 启动服务器服务器屏幕上显示服务器启动信息,此时“启动”按钮自动变成“停止”按钮,用户可随时单击它以停止we

36、b服务线程的运行。在电脑上面的浏览器中浏览服务器中已有的网页,在地址栏中输入17:8080/cq.htm(本次实验没有实现DNS域名解析功能,所以在访问服务器的时候采用直接给出IP地址的方式),单击链接按钮或者直接回车,浏览显示效果如下图所示:图 5.5 网页浏览效果5.2.2 访问网页中的图片从上图中我们可以知道,程序能够显示页面,但是显示的页面却不完整,尤其在页面上本来应该显示图片的位置都没有正常的显示出来,现在我们单独访问服务器上面的图片。在浏览器中输入17:8080/1.jpg后回车,显示图片如下图所示:图 5.6 图

37、片显示效果5.2.3 访问网页正常由上图我们知道图片可以正常的显示出来,后面在上网查询才知道,我们在实验中所用到的图片要与页面在同一个目录下面,所以我们就要将图片全部保存到与页面想同的目录下,如下图所示:图 5.7 将页面文档与网页资源放置在同一目录下面现在我们在重新输入17:8080/cq.htm回车,先在网页的显示效果图如下所示:图 5.8 完整网页显示效果图现在我们在去看web服务器会发现,显示网页这个过程中创建了很多个Socket,他们都是Stream类型的,并且web页面上的各个资源是分别独立加载到浏览器端的。没加载完页面上的一个资源就关闭它所对应的

38、Socket,当继续加载新的资源时,又要用一个新创建的Socke连接,如下图所示:图 5.9web服务器上的多个Socket一个TCP连接只作为单个资源的下载之用,用完后服务器主动断开连接,这正好符合万维网的工作过程,因此将TCP连接成为短连接。5.3 访问网页错误信息程序中有写到只要是端口不正常,地址不正确,虚拟目录没有找到,我们在访问网页的是时候就会给我们错误信息的提示。(1)下图就是我们在访问网站17:8080/cq1.htm的时候由于虚拟目录错误,所以出现的提示。图 5.10 虚拟目录没找到(2)下图就是在我们访问的地址14:8080/cq.htm出错的时候,由于IP地址不对,所以根本就进不了服务器。图 5.11 IP地址错误6.C#安装软件设计这个项目的主要功能就是讲我写的那个web服务器编写成为一个安装软件,让我们能够把软件考出去安装,而不用打开vs2010软件来运行程序,这样让我们在实验中可以更加方便快捷。下面就是C#安装软件设计的步骤:(1)首先建立一个setup工程,打开vs2010软件,在文件中新建项目弹出下图的框架。图 6.1 新建安装软件工程(2)然后在文件系统中的“应用程序文件夹”右击“添加”文件夹,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论