TCPIP课程设计报告.docx

上传人:b****1 文档编号:12450417 上传时间:2023-04-19 格式:DOCX 页数:27 大小:1.67MB
下载 相关 举报
TCPIP课程设计报告.docx_第1页
第1页 / 共27页
TCPIP课程设计报告.docx_第2页
第2页 / 共27页
TCPIP课程设计报告.docx_第3页
第3页 / 共27页
TCPIP课程设计报告.docx_第4页
第4页 / 共27页
TCPIP课程设计报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

TCPIP课程设计报告.docx

《TCPIP课程设计报告.docx》由会员分享,可在线阅读,更多相关《TCPIP课程设计报告.docx(27页珍藏版)》请在冰豆网上搜索。

TCPIP课程设计报告.docx

TCPIP课程设计报告

 

重庆科技学院

 

《XXXX设计》

课程设计报告

学院:

电气与信息工程学院_专业班级:

计科普10-02

学生姓名:

唐柳学号:

201044189

设计地点(单位)_______I520__________

设计题目:

WEB服务器

完成日期:

2013年1月12日

指导教师评语:

____________________________________

______________________________________________________________________________________________________________________________________________________

成绩(五级记分制):

________________

指导教师(签字):

________________

摘要

本专题将针对HTTP协议定义一个Web服务器,我们平常浏览网页通过在浏览器中输入一个网址就可以看到我们想要的网页,这个过程中浏览器只是一个客户端,浏览器(应用层应用程序)通过HTTP协议把用户请求发送到服务端,服务器接受到发送来的HTTP请求,然后对请求进行处理和响应,最后把响应的内容发送给客户端(浏览器这里充当了用户代理的客户端),浏览器再对接受到的响应内容(一般是HTML文件)进行解释并且显示出来。

这就是一次完整的用户请求/响应模型,本专题所讲述的是一个简单的Web服务器,其他一些大型的Web服务器(IIS,Apache)也是这样的一个原理,本专题只是简单讲述Web服务器的实现原理。

关键字:

HTTP协议客户端web服务器

 

目录

1.概要1

1.1C#软件实现原理1

1.2HTTP协议的作用原理1

2.界面设计3

2.1服务器界面3

2.2服务器界面控件3

3.实现流程5

4.服务器编程6

4.1设计HTTPweb服务器6

4.1.1创建TcpListener对象6

4.1.2接受客户端请求6

4.1.3读取请求内容7

5.测试web服务器13

5.1实验准备13

5.1.1创建文件夹13

5.1.2保存测试网页及图片13

5.2访问web服务器虚拟目录下的网页和图片15

5.2.1访问网页显示不全面15

5.2.2访问网页中的图片16

5.2.3访问网页正常16

5.3访问网页错误信息18

6.C#安装软件设计19

7.总结23

致谢24

参考文献25

1.概要

一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。

这个客户端通常指的是Web浏览器。

1.1C#软件实现原理

C#实现WEB服务器、HTTP协议的作用原理:

WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页。

WWW的工作基于客户机/服务器计算模型,由Web浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。

HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。

1.2HTTP协议的作用原理

HTTP协议的作用原理包括四个步骤:

1)连接:

Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。

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命令:

GETcq.htmHTTP/1.0。

主机名为172.19.68.117的Web服务器从它的文档空间中搜索子目录的文件cq.htm。

如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。

为了告知Web浏览器传送内容的类型,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开。

常用的HTTP头信息有:

①HTTP1.0200OK:

这是Web服务器应答的第一行,列出服务器正在运行的HTTP版本号和应答代码。

代码“200OK”表示请求完成。

②MIME_Version:

1.0:

它指示MIME类型的版本。

③content_type:

类型:

这个头信息非常重要,它指示HTTP体信息的MIME类型。

如:

content_type:

text/html指示传送的数据是HTML文档。

④content_length:

长度值:

它指示HTTP体信息的长度(字节)。

4)关闭连接:

当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。

 

2.界面设计

2.1服务器界面

作为服务器,即使是GUI界面,也应当简洁为好。

本程序将服务器配置功能以图形方式提供,但对于服务运行过程中的状态监控,仍旧采用字符显示方式。

本次使用了一个ListBox列表控件,将它的背景设置为黑色,并将其设置成为不可选择,以模拟Dos命令行效果。

界面显示如下图所示;

图2.1界面显示

2.2服务器界面控件

软件工程名为“MyWebServer”,程序界面上个控件的属性描述如下表所示:

表1-1web服务器界面控件描述

名称

控件类型

功能描述

frmWebServer

Form

程序主窗体

listBoxStatusView

ListBox

服务状态控制栏

tbxWebServerIp

TextBox

填写服务IP地址

tbxWebServerPort

TextBox

填写服务端口号

tbxWebRoot

TextBox

设置填写根目录

btnStartStop

Button

服务“启动/停止”按钮

3.实现流程

使用TcpListener类的方法实现,流程如下图所示。

(1)首先web服务器以TcpListener类建立服务器socket,对某个端口进行监听,实验中的端口号是8080,以等待客户端连接该端口。

(2)处理客户端的连接:

建立客户端连接,可以使用TcpListener类的AcceptSocket方法或者是AcceptTcpClient方法。

AcceptSocket方法可以接受客户端的请求,并且建立与客户端的连接的Socket。

(3)处理完数据传送或接受:

使用Socket类的Send与Receive方法传输及接受数据。

(4)完毕时,关闭web浏览器和web服务器的Socket连接。

图3.1web服务器实现流程

 

4.服务器编程

4.1设计HTTPweb服务器

4.1.1创建TcpListener对象

(1)开始监听端口

InstanceLst=newTcpListener(IPAddress.Parse(tbxWebServerIp.Text),

int.Parse(tbxWebServerPort.Text));

InstanceLst.Start();

(2)同时启动一个监听进程”StartListen“

ListTh=newThread(newThreadStart(StartListen));

ListTh.Start();

(3)其中,IstanceLst是TcpListener类的对象,ListTh是监听线程,它们的定义如下:

privateTcpListenerInstanceLst=null;

privateThreadListTh;

4.1.2接受客户端请求

while(true)

{

SocketmySocket=InstanceLst.AcceptSocket();

listBoxStatusView.Items.Add("Socket类型:

"+mySocket.SocketType);

listBoxStatusView.TopIndex=listBoxStatusView.Items.Count-1;

if(mySocket.Connected)

{

listBoxStatusView.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方法取得该请求。

代码如下:

Byte[]bReceive=newbyte[1024];

try

{

inti=mySocket.Receive(bReceive,bReceive.Length,0);

}

catch(Exceptione)

{

listBoxStatusView.Items.Add(e.ToString());

break;

}

(2)转换成字符串类型,服务器将取得的HTTP请求内容转换成字符串,存储在缓冲区sBuffer中,以便下面处理。

stringsBuffer=Encoding.ASCII.GetString(bReceive);

(3)HTTP协议本身比较复杂,只处理简单客户请求的GET方法,该方法是客户端请求下载web网页的方法,是最常用的。

对GET请求进行处理代码如下:

1)只处理“GET”请求类型

if(sBuffer.Substring(0,3)!

="GET")

{

listBoxStatusView.Items.Add("只处理”GET“请求类型!

");

mySocket.Close();

return;

}

2)查找”HTTP“的位置

iStartPos=sBuffer.IndexOf("HTTP",1);

stringsHttpVersion=sBuffer.Substring(iStartPos,8);

3)得到请求类型和文件目录文件名

sRequest=sBuffer.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(sRequest.IndexOf("/"),sRequest.LastIndexOf("/")-3);

经过上面的处理,web服务器从HTTP请求报文中,解析出客户端想要浏览资源的文件名和其所在目录。

(4)默认这个文件所在目录就是用户在软件界面的“根目录”一栏所填写的路径,也就是服务器的程序代码中定义的虚拟目录,而这里我们注重的一点就是我在寻找路径的时候,是寻找当前路径,这样对我们来说方便很多。

代码如下所示:

1)获取虚拟目录物理路径

sLocalDir=sMyWebServerRoot;

listBoxStatusView.Items.Add("请求文件目录:

"+sLocalDir);

listBoxStatusView.TopIndex=listBoxStatusView.Items.Count-1;

if(sLocalDir.Length==0)

{

sErrorMessaage="

错误!

请求目录不存在


";

SendHeader(sHttpVersion,"",sErrorMessaage.Length,"404NotFound",refmySocket);

SendToBrowser(sErrorMessaage,refmySocket);

mySocket.Close();

continue;

}

if(sRequestedFile.Length==0)

{

//取得请求文件名

sRequestedFile="index.html";

}

2)取得请求文件类型(设定为text/html)

StringsMimeType="text/html";

sPhysicalFilePath=sLocalDir+sRequestedFile;

listBoxStatusView.Items.Add("请求文件:

"+sPhysicalFilePath);

listBoxStatusView.TopIndex=listBoxStatusView.Items.Count-1;

if(File.Exists(sPhysicalFilePath)==false)

{

sErrorMessaage="

404Error!

FileDoesNotExits...

";

SendHeader(sHttpVersion,"",sErrorMessaage.Length,"404NotFound",refmySocket);

SendToBrowser(sErrorMessaage,refmySocket);

listBoxStatusView.Items.Add(sFormattedMessage);

listBoxStatusView.TopIndex=listBoxStatusView.Items.Count-1;

}

else

{

intiTotBytes=0;

sRequest="";

FileStreamfs=newFileStream(sPhysicalFilePath,FileMode.Open,FileAccess.Read,FileShare.Read);

BinaryReaderreader=newBinaryReader(fs);

byte[]bytes=newbyte[fs.Length];

intread;

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,"200ok",refmySocket);

SendToBrowser(bytes,refmySocket);

}

处理结束后,向客户端返回响应数据。

(5)如上面的代码所示,视处理结果向客户端浏览器发送出不同的响应。

1)如果客户请求的文件不存在,则返回错误信息。

if(File.Exists(sPhysicalFilePath)==false)

{

sErrorMessaage="

404Error!

FileDoesNotExits...

";

SendHeader(sHttpVersion,"",sErrorMessaage.Length,"404NotFound",refmySocket);

SendToBrowser(sErrorMessaage,refmySocket);

listBoxStatusView.Items.Add(sFormattedMessage);

listBoxStatusView.TopIndex=listBoxStatusView.Items.Count-1;

}

2)如果文件存在,则返回网页内容至客户端web浏览器,代码如下所示。

else

{

intiTotBytes=0;

sRequest="";

FileStreamfs=newFileStream(sPhysicalFilePath,FileMode.Open,FileAccess.Read,FileShare.Read);

BinaryReaderreader=newBinaryReader(fs);

byte[]bytes=newbyte[fs.Length];

intread;

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,"200ok",refmySocket);

SendToBrowser(bytes,refmySocket);

}

由上述程序可以看出,web服务器响应客户端是分两步动作完成的:

(6)返回HTTP响应头,用SendHeader()方法。

所有HTTP响应头的第一行都是状态行,该行内容依次是当前HTTP版本号,3位数字组成的状态码,以及描述状态的短语,各项之间用空格分隔。

状态行之后是标头信息。

一般情况下,服务器会返回一个名为Data的标头,表示响应生成的日期与时间,同时服务器还可能会返回一些关于自身的信息。

接下来两个标头是Content-Type和Content-Length。

再返回信息中,首部Content-Type指定了MIME类和HTML(text/html),编码类型是GB2312。

下面代码就是用SendHeader()方法给响应头个字段赋值。

//HTTP响应头

publicvoidSendHeader(stringsHttpVersion,stringsMIMEHeader,intiTotBytes,stringsStatusCode,refSocketmySocket)

{

StringsBuffer="";

if(sMIMEHeader.Length==0)

{

sMIMEHeader="text/html";//默认text/html

}

sBuffer=sBuffer+sHttpVersion+sStatusCode+"\r\n";

sBuffer=sBuffer+"Server:

cx1193719-b\r\n";

sBuffer=sBuffer+"Content-Type:

"+sMIMEHeader+"\r\n";

sBuffer=sBuffer+"Accept-Ranges:

bytes\r\n";

sBuffer=sBuffer+"Content-Length:

"+iTotBytes+"\r\n\r\n";

Byte[]bSendData=Encoding.ASCII.GetBytes(sBuffer);

SendToBrowser(bSendData,refmySocket);

listBoxStatusView.Items.Add("总字节:

"+iTotBytes.ToString());

listBoxStatusView.TopIndex=listBoxStatusView.Items.Count-1;

}

(7)返回响应数据(包含网页内容),用SendToBrowser()方法。

HTTP响应数据。

它是web服务器向浏览器返回信息的主体部分,在不出错的条件下,它所包含的就是所请求资源的HTML源文件内容。

对于客户端浏览器来说,它接收到HTTP响应后,会自动分析HTML源文件,然后将其显示出来,这就是通过浏览器看到的页面。

下面代码就是用SendToBrowser()方法返回响应数据。

//返回相应数据

publicvoidSendToBrowser(StringsData,refSocketmySocket)

{

SendToBrowser(Encoding.ASCII.GetBytes(sData),refmySocket);

}

publicvoidSendToBrowser(Byte[]bSendData,refSocketmySocket)

{

intnumBytes=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(Exceptione)

{

Console.WriteLine("发生错误:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

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

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