
文档管理信息表
| 主题 | web服务器 |
| 版本 | 1.0 |
| 内容 | 可响应客户端发送文件请求的web服务器 |
| 关键字 | 套接字,请求报文,响应报文,tcp编程 |
| 参考文档 | 无 |
| 创建时间 | 2016/4/2 |
| 创建人 | 吴鑫 |
| 最新发布日期 | 2016/4/2 |
| 更改人 | 日期 | 更改内容 |
| 何鑫 | 2016/4/4 | 创建文件 |
开发人员
| 角 色 | 主要职责 | 负责模块 | 人员 | 备注 |
| 何鑫 | ⏹负责编写窗口界面 ⏹创建通信套接字建立连接 ⏹获取http请求,解析请求报文 ⏹封装文件到http响应报文中,并发送该响应报文 ⏹软件的测试与优化 | ⏹xxx模块 | xxx | |
| ⏹ | ||||
| ⏹ | ⏹ | |||
| ⏹ | ⏹ | |||
| ⏹ | ⏹ |
开发工具
| 工具 | 作用 |
| Microsoft visual studio 2010 | web服务器,窗口界面 |
概念术语描述
术语1
静态文本框
术语2
请求报文
响应报文
基本设计描述
1.传入一个与某个浏览器通信的套接字
2.启动一个线程来监听浏览器接收到的数据recive
3.如果监听浏览器的请求报文了,要:
3.1要将请求报文显示在服务器软件的文本框中
3.2要分析浏览器发来的请求报文
3.3要根据请求报文处理浏览器的请求页面
4.生成响应报文,并输出到浏览器T
5.关闭当前连接
主要界面功能流程描述
功能1界面流程
1.使用vs2010创建一个基于c#的窗体程序
2.使用静态文本框,按钮等元素布置界面
3.添加显示文本框用来显示“ip”,“端口号”,和“日志”
3.给两个按钮的text重命名并在name里给其命名
4.最终窗体界面如图所示:
(注:我们默认服务器的ip地址为127.0.0.1,端口号为5004)
功能2创建浏览器和服务器的通信流程
数据结构
数据库表列表
| 表名 | 作用 |
| endpoint | 网络节点对象,用来传入ip号和端口号 |
| adress | 用来获得IP这个文本框里面的内容,为将套接字绑定到端口号中做准备 |
| threadwatch | 创建负责调用套接字监听的线程 |
| sokwatch | 负责监听浏览器的套接字 |
| " sokconnection | 接收浏览器请求并生成相应的通信套接字对象 |
| isrunning | 用来控制监听循环是否退出 |
| 模块名称(英文) | 功能 | 备注 |
| 模块1 sokwatch.Bind(endpoint) | 将套接字绑定到指定的端口号上 | |
| 模块2 sokwatch.Listen(10) | 设置监听队列(监听套接字能够同时处理的浏览器连接请求最大个数) | |
| 模块3 void watchConnectt() | 监听浏览器的连接请求 | |
| 模块4 threadwatch = new Thread(watchConnectt) | 实例化线程 | |
| 模块5 threadwatch.Start() | 启动线程 | |
| 模块6 void showmsg(string msg) | 用来在txtmsglog文本框中显示相应的连接信息 |
模块列表
| 模块名称(英文) | 功能 | 备注 |
| 模块1 public delegate void DGshowmsg(string msg) | 用来在控件上显示消息的委托类型 | 新建类Dataconnection |
| 模块2 public delegate void DGshowmsg(string msg) | 用来在控件上显示消息的委托类型 | 新建类Gshowmsg,并用委托类型 |
| 模块3 public Dataconnection(Socket sokconnection,DGshowmsg dgshow) | 在Dataconnection类里,通过在构造函数传入参数的方式来传入与某个浏览器通信的套接字和线程 | |
| 模块4 this.threadconnection = new Thread(recmsg); | 直接在内部来创建通信线程对象 | |
| 模块5 this.threadconnection.IsBackground = true; this.threadconnection.Start(); | 启动该线程,并将其设置为后台线程arrmsg | |
| 模块6 length = sokconnection.Receive(arrmsg); | 将浏览器发来的数据装入缓存区,并获得真实的数据长度 | |
| 模块7 Try{} Catch{} | 调用委托对象来在文本框中打印异常消息 | |
| 模块8 dgshow(recmsg); | 在文本框中显示消息 |
数据库表列表
| 表名 | 作用 |
| conn | 创建Dataconnection类对象,并传入当前套接字和线程 |
| arrmsg | 字节数组,当做缓存区 |
| length | 用来存放浏览器发来的数据的长度 |
| recmsg | 用来存储已转换成字符串类型的数据 |
模块列表
| 模块名称(英文) | 功能 | 备注 |
| 模块1
public HttpRequestmodel(string requeststr) {} | 生成请求报文实体对象,并分析请求报文字符串,将每个语义字符都次实体类的相应属性中 | 新建类HttpRequestmodel |
| 模块2 string [] arrequest=requeststr.Replace("\\r\\n | 这里表示的是将‘\\r\\n’转换成‘籀’,便于处理,并分割字符 | 新建类Gshowmsg,并用委托类型 |
| 模块3 string[] firstrow = arrequest[0].Split(' '); | 按照控件将已经分割好的字符再分割 | |
| 模块4 给路径赋值 |
数据库表列表
| 表名 | 作用 |
| path | 定义页面路径字符串 |
模块列表
| 模块名称(英文) | 功能 | 备注 |
| 模块1
dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName; | 获得浏览器请求文件的物理路径 | 默认该请求文件在工程目录下 |
| 模块2 Switch() { Case: Case: } | 根据请求文件的后缀名不同来做出不同的判断 | |
| 模块3 void ProcessstaticPage(string path) | 该方法用来专门处理静态文件 | |
| 模块4 using(FileStream fs=new FileStream(path,FileMode.Open)){} | 使用文件流的方式来读取文件 | 前提是要为FileStream导入命名空间 |
数据库表列表
| 表名 | 作用 |
| requestModel | 在dataconnecton类里创建请求报文实体对象 |
| dataDir | 用来存放当前执行程序的物理路径 |
| fileDir | 存储请求文件的物理路径 |
| extentionName | 存储请求文件的后缀名 |
模块列表
| 模块名称(英文) | 功能 | 备注 |
| 模块1
public byte[] GetHttpResponseHeader(){} | 返回响应报文头字符串 | 默认该请求文件在工程目录下 |
| 模块2 return System.Text.Encoding.UTF8.GetBytes(sbResponse .ToString ()); | 返回请求文件的字节数组 | |
| 模块3 sokconnection.Send(model.GetHttpResponseHeader()); | 利用套接字来将响应报文头发送回去 | |
| 模块4 | 使用文件流的方式来读取文件 | 前提是要为FileStream导入命名空间 |
数据库表列表
| 表名 | 作用 |
| arrfile | 以二进制形式存储的文件数据 |
| contentType | 默认的响应内容的类型 |
| sbResponse | 用来显示响应报文头 |
| model | 生成响应报文头对象 |
第三方组件
使用的命名空间:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;
参考资料
自己动手写web服务器(视频版)
