ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:1.67MB ,
资源ID:12450417      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12450417.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(TCPIP课程设计报告.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

TCPIP课程设计报告.docx

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

2、P请求,然后对请求进行处理和响应,最后把响应的内容发送给客户端(浏览器这里充当了用户代理的客户端),浏览器再对接受到的响应内容(一般是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

3、web服务器 64.1.1创建TcpListener对象 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.

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

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

6、.htm HTTP/1.0。主机名为172.19.68.117的Web服务器从它的文档空间中搜索子目录的文件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

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

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

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

10、TTP web服务器4.1.1创建TcpListener对象(1)开始监听端口 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是监听线程,它们的定

11、义如下: private TcpListener InstanceLst = 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) listBoxStat

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

13、Byte bReceive = 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)得到请求类型和文件目录文件名 sRequest = sBuffe

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

16、uest.IndexOf(/), sRequest.LastIndexOf(/) - 3);经过上面的处理,web服务器从HTTP请求报文中,解析出客户端想要浏览资源的文件名和其所在目录。(4)默认这个文件所在目录就是用户在软件界面的“根目录”一栏所填写的路径,也就是服务器的程序代码中定义的虚拟目录,而这里我们注重的一点就是我在寻找路径的时候,是寻找当前路径,这样对我们来说方便很多。代码如下所示:1)获取虚拟目录物理路径sLocalDir = sMyWebServerRoot;listBoxStatusView.Items.Add(请求文件目录: + sLocalDir);listBoxSta

17、tusView.TopIndex = listBoxStatusView.Items.Count - 1; if (sLocalDir.Length = 0) sErrorMessaage = 错误!请求目录不存在; SendHeader(sHttpVersion, , sErrorMessaage.Length, 404 Not Found, ref mySocket); SendToBrowser(sErrorMessaage, ref mySocket); mySocket.Close(); continue; if (sRequestedFile.Length = 0) /取得请求文件

18、名 sRequestedFile = index.html; 2)取得请求文件类型(设定为text/html) String sMimeType = text/html; sPhysicalFilePath = sLocalDir + sRequestedFile; listBoxStatusView.Items.Add(请求文件: + sPhysicalFilePath); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; if (File.Exists(sPhysicalFilePath) = false) sE

19、rrorMessaage = 404 Error!File Does Not Exits.; 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 iTotByt

20、es = 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 + Encoding.ASCII

21、.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.Exists(sPhysicalFilePath)

22、= false) sErrorMessaage = 404 Error!File Does Not Exits.; SendHeader(sHttpVersion, , sErrorMessaage.Length, 404 Not Found, ref mySocket); SendToBrowser(sErrorMessaage, ref mySocket); listBoxStatusView.Items.Add(sFormattedMessage); listBoxStatusView.TopIndex = listBoxStatusView.Items.Count - 1; 2)如果文

23、件存在,则返回网页内容至客户端web浏览器,代码如下所示。else int iTotBytes = 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)

24、 != 0) sResponse = sResponse + Encoding.ASCII.GetString(bytes, 0, read); iTotBytes = iTotBytes + read; reader.Close(); fs.Close(); SendHeader(sHttpVersion, sMimeType, iTotBytes, 200 ok, ref mySocket); SendToBrowser(bytes, ref mySocket); 由上述程序可以看出,web服务器响应客户端是分两步动作完成的:(6)返回HTTP响应头,用SendHeader()方法。所有H

25、TTP响应头的第一行都是状态行,该行内容依次是当前HTTP版本号,3位数字组成的状态码,以及描述状态的短语,各项之间用空格分隔。状态行之后是标头信息。一般情况下,服务器会返回一个名为Data的标头,表示响应生成的日期与时间,同时服务器还可能会返回一些关于自身的信息。接下来两个标头是Content-Type和Content-Length。再返回信息中,首部Content-Type指定了MIME类和HTML(text/html),编码类型是GB2312。下面代码就是用SendHeader()方法给响应头个字段赋值。/HTTP响应头 public void SendHeader(string sHt

26、tpVersion, string sMIMEHeader, int iTotBytes, string sStatusCode, ref Socket mySocket) String sBuffer = ; if (sMIMEHeader.Length = 0) sMIMEHeader = text/html; / 默认 text/html sBuffer = sBuffer + sHttpVersion + sStatusCode + rn; sBuffer = sBuffer + Server: cx1193719-brn; sBuffer = sBuffer + Content-Ty

27、pe: + sMIMEHeader + rn; sBuffer = sBuffer + Accept-Ranges: bytesrn; sBuffer = sBuffer + Content-Length: + iTotBytes + rnrn; Byte bSendData = Encoding.ASCII.GetBytes(sBuffer); SendToBrowser(bSendData, ref mySocket); listBoxStatusView.Items.Add(总字节: + iTotBytes.ToString(); listBoxStatusView.TopIndex =

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

29、oBrowser(Encoding.ASCII.GetBytes(sData), ref mySocket); public void SendToBrowser(Byte 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.TopIndex = listBoxStatusView.Items.Count - 1; else listBoxStatusView.Items.Add(连接失败!); catch (Exception e) Console.WriteLine(发生错误:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1