实验报告
( 实验二: 非阻塞HTTP服务器 )课程名称: 网络课程设计II
姓 名:
学 院:
专 业:
年 级: 大三年级
学 号:
指导教师:
职 称:
资料内容仅供您学习参考如有不当或者侵权请联系改正或者删除。
年 11月 15 日
一、 实验目的和要求
理解进程和线程的概念;
1.掌握使用j av a.n i o包中的类创立非阻塞模式的服务器的方法,并能给出实现代码;
2.掌握HTTP协议的处理原理和代码实现过程。
二、实验内容
1. 分析说明 :
( 1 )分析课本5. 2节创立的非阻塞的HTTP服务器中主要包含了哪些主要的类?这些类的功能是什么?
1 .HttpServer :服务器主程序, 负责启动服务器;
2.AcceptHandler : 负责接收客户端连接;
3.ReuqestHandler : 负责接收客户端的HTTP请求,解析,生成HTTP响应, 再返回给客户端;
资料内容仅供您学习参考如有不当或者侵权请联系改正或者删除。
4.Request :抽象化HTTP请求;
5.Response :抽象化HTTP响应;
6.Content :表示HTTP响应的正文;
( 2 )分析课本例5-2 , 并逐行进行注释, 说明其意义。public class HttpServer {private Selector selector = null ; //声明一个Selector成员变量private ServerSocketChannel serverSocketChannel = null;//声明一个ServerSocketChannel成员变量private int port = 8062; //设置端口号为8062private Charset charset = Charset.forName("UTF-8") ; //设置字符集为UT F-8public HttpServer() throws IOException{ //HttpServer类唯一构造器selector = Selector.open() ;//注册一个selector对象serverSocketChannel = ServerSocketChannel.open() ;//
资料内容仅供您学习参考如有不当或者侵权请联系改正或者删除。
创立一个serverSocketChannel对象serverSocketChannel. socket() . setReuseAddress(true) ;//设置为能够顺利在重启后绑定端口serverSocketChannel. configureBlocking(false) ;//设置为非阻塞模式serverSocketChannel. socket() .bind(new
InetSocketAddress(port)) ;//把服务器与一个本地端口进行绑定
System.out.println("server is running!") ;
}public void service() throws IOException{
//注册连接就绪事件serverSocketChannel.register(selector,
SelectionKey.OP_ACCEPT,new AcceptHandler() ) ;
//死循环保持监听for(; ;) {int n= selector. select() ;//取得监听到的事件的数量
资料内容仅供您学习参考如有不当或者侵权请联系改正或者删除。if(n==0) continue; //若无事件发生,则进入下一次循环
Set readyKeys = selector. selectedKeys() ; //将事件存入Set集合中
Iterator it = readyKeys. iterator() ; //获取Set集合的迭代器while(it.hasNext()) {
SelectionKey key = null ;try{key = (SelectionKey) it.next() ; //使用迭代器将事件存入句柄对象it.remove() ; //将取出的对象从集合中移除final Handler handler = (Handler)key.attachment() ; //将与key关联的附件传给handlerhandl er.handle(key) ; //在Handler中处理事件
}catch(IOException e) {//若捕获IO异常做如下
资料内容仅供您学习参考如有不当或者侵权请联系改正或者删除。
处理e.printStackTrace() ;//打印异常信息try{if(key!=null) {//判断key是否为空key.cancel() ;//使这个key失效//使得Selector不在监控这个SelectionKey感兴趣的事件key. channel() .close() ;
}
}catch(Exception ex) {//若捕获异常ex.printStackTrace() ;//打印异常信息}
}
}
}
}
}
资料内容仅供您学习参考如有不当或者侵权请联系改正或者删除。
2. 实例操作:
对课本5. 2节中的代码进行扩展,完成课本5. 3节中扩展方法
( 1 ) ~ ( 4 ) 。
解答:
(1).首先再Request的属性中加入参数这一项:
经过对URI字符串的多次分割处理, 将键值对存入参数中
资料内容仅供您学习参考如有不当或者侵权请联系改正或者删除。
结果:
(2).由于我们已经将参数这一项以HashMap对象的形式加入到了Request类中, 获取函数getParameter()实现如下:
(3)创立一个Servlet接口 , service方法负责生成动态网页。
资料内容仅供您学习参考如有不当或者侵权请联系改正或者删除。
(4)要支持POST方法,就要能获得请求正文中的数据, 因此要首先重新编写Reuquest 中删除请求正文的方法,在action =Request.Action.POST时 , 对请求正文中的数据加以分析处理。
RAKsmart怎么样?RAKsmart机房即日起开始针对洛杉矶机房的独立服务器进行特别促销活动:低至$76.77/月,最低100Mbps带宽,最高10Gbps带宽,优化线路,不限制流量,具体包括有:常规服务器、站群服务器、10G大带宽服务器、整机机柜托管。活动截止6月30日结束。RAKsmart,美国华人老牌机房,专注于圣何塞服务器,有VPS、独立服务器等。支持PayPal、支付宝付款。点击直达...
搬瓦工最新优惠码优惠码:BWH3HYATVBJW,节约6.58%,全场通用!搬瓦工关闭香港 PCCW 机房通知下面提炼一下邮件的关键信息,原文在最后面。香港 CN2 GIA 机房自从 2020 年上线以来,网络性能大幅提升,所有新订单都默认部署在香港 CN2 GIA 机房;目前可以免费迁移到香港 CN2 GIA 机房,在 KiwiVM 控制面板选择 HKHK_8 机房进行迁移即可,迁移会改变 IP...
Virtono是一家成立于2014年的国外VPS主机商,提供VPS和服务器租用等产品,商家支持PayPal、信用卡、支付宝等国内外付款方式,可选数据中心共7个:罗马尼亚2个,美国3个(圣何塞、达拉斯、迈阿密),英国和德国各1个。目前,商家针对美国圣何塞机房VPS提供75折优惠码,同时,下单后在LET回复订单号还能获得双倍内存的升级。下面以圣何塞为例,分享几款VPS主机配置信息。Cloud VPSC...