tcp作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
异步HTTP服务器的实现实验报告
实验名称: WEB服务器的实现
参与人员:
实验目的:
掌握如何使用套接口API进行网络编程,学习一些常见的C/S服务器模型设计和相应的编程方法。
实验内容:
开发一个简单的Windows平台上的Web服务器,实现以下功能:
(1)支持HTTP-GET请求;
(2)支持以HTM/HTML为文件后缀名的标准网页;
(3)采用多线程技术,支持多用户同时访问;
(4)采用完成端口模型;
(5)可以配置服务器的监听端口和默认页面。
实验准备说明:
一.开发环境介绍:
开发工具:Jdk“1.7.0_51”+Eclipse
语言:Java
操作系统:WIN7(32bit)/WIN7(64bit)
二.开发工具介绍
Eclipse是著名的自由集成开发环境(IDE),主要用来Java语言开发,从编写、查错、编译、帮助等等各方面为Java语言贴身定做,最大的优点是非常好的跨平台性,因为本次实验是用JAVA语言实现,所以我们选择了Eclipse作为开发环境。
三.开发环境搭建
1)下载JDK。从Java的官方网站下载,我们下载的版本是Jdk “1.7.0_51”,完成下载后需要进行环境变量配置。如:右键点击“我的电脑”-->“属性”-->“高级”-->“环境变量”,配置classpath、JAVA_HOME、path。
2) 下载Eclipse。从Eclipse的官方网站/上下载,下载完成后选择安装即可。
实验设计与开发:
一、程序功能简介
本程序一共三个ui界面。主要实现了java的异步服务器,即在开启服务器之后,在浏览器中输入请求可以返回一个界面。
运行程序以后,可以输入想要监听的端口号,再点击启动服务器,可以看到服务器的info-text栏中显示服务器等待的信息,这时在浏览器中输入相应的界面的网址,可以返回一个对应的界面,如果没有指定的界面地址,则返回默认页面,即hello world!同时,在info_text栏中会显示出相应的请求信息,Eclipse中也会打印request信息。
程序运行过程中点击放置托盘,可以使窗口最小化到桌面任务栏,此时Eclipse中会显示窗口最小化的字样。再双击任务栏图标,就可以使窗口重新显示,这时Eclipse会打印窗口恢复正常大小。
另外,在程序运行过程中,可以随时更改监听的端口号,更改以后再点击启动服务器可以在新的端口上实现监听。
本程序第二个界面实现了显示发送请求的次数的功能。即可以监听到客户端发送了多少次请求。
第三个界面主要是用来介绍程序开发人员的相关信息,也为了使ui界面得到相应的美化。
二、异常处理
输入端口号的地方如果输入的长度超过4位,则会有弹窗提示,并将端口号默认为8080。如果没有填写,也会提示填写端口号。
在程序运行过程中可以随时修改端口号,然后点击启动服务。
如果查找的html文件不存在,在info-text中可以打印出该文件不存在的信息。如果该端口已经被绑定过,info-text中可以打印出端口已经被绑定的异常信息。
三、程序流程图
图1 服务器接受请求流程图
图2 服务器响应请求流程图
四、AIO与NIO的比较
本程序利用了java 的异步io功能,所谓异步io(即aio),并非简单的非阻塞io(nio)如下图介绍我们可以看到nio与aio的区别
从图中可以看出,当用户进程发出read操作时,如果cpu中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。从用户进程角度讲,它发起一个read 操作后,并不需要等待,而是马上就得到了一个结果。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发送read操作。一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上就将数据拷贝到了用户内存,然后返回。
所以,用户进程其实是需要不断的主动询问cpu数据好了没有。
用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从cpu的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,cpu会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,cpu会给用户进程发送一个signal,告诉它read操作完成了。
对比两者可以发现,non-blocking IO在执行recvfrom这个system call的时候,如果cpu的数据没有准备好,这时候不会block进程。但是,当cpu中数据准备好的时候,recvfrom
会将数据从cpu拷贝到用户内存中,这个时候进程是被block了,在这段时间内,进程是被block的。而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到cpu发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。
注:由于java中没有完成端口模型,而所谓的nio并非完全的异步,所以我们选择了nio2中提供的aio来实现与完成端口一样的功能。
五、关键算法分析
1、关于默认页面的设置
本段代码实现了根据request,来判断显示文件夹中的哪个html界面。首先将request 分词,如果是GET请求,则进行下一步的判断(对POST请求不作处理),通过方法StringTokenizer可以将request按照“\t”“\n”等标识符分词,如果没有请求内容(即请求中只有/)那么返回默认页面,否则返回指定的页面。
2、关于异步操作的设置