




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
简单应用系统学年设计简单应用系统学年设计 任务书任务书 学 院 计算机与信息工程学院专 业网络工程 课程名称 简单应用系统 题 目基于 socket 的 http 请 求监听程序的设计实现 完成期限自 2015 年 7 月 9 日 至 2015 年 8 月 30 日 共 8 周 内 容 及 任 务 一、项目的目的一、项目的目的 用 java 编写一个监听程序,监听指定的端口,通过浏 览器如 http:/localhost:7777 来访问时,可以把请求到的内 容记录下来,记录可以存文件,sqlit,mysql 数据库,然后把 接受到的信息在浏览器中显示出来 二、项目任务的主要内容和要求二、项目任务的主要内容和要求 监听指定的端口,通过浏览器如 http:/localhost:7777 来访问时,可以把请求到的内容记录下来,记录可以存文件, sqlit,mysql 数据库,然后把接受到的信息在浏览器中显示出 来。 实现本程序需要了解网络基础知识、网络安全基础知识, 掌握 c/s 结构的工作特点,掌握高级语言及网络编程知识,可 以选择 visual c+、c 或 java 等语言实现。 三、项目设计(研究)思路三、项目设计(研究)思路 1.用到的主要技术: socket,线程,数据库,io 操作 2.设计思路: 我们如何来设计这个小系统,这个系统包含三部分的内容, 一个是监听端口,二是记录日志,三是数据回显,端口监听第 一想到的就是 socket 编程了,数据回显也是一样的,无非是把 当前请求客户端的 socket 获取到,然后把消息通过流输出出去 ,日志的记录因为是要多种实现策略,这里我们使用了一个观 察者模式来实现,服务器可以添加任意多个观察着,因此有着 很灵活的扩展性,在实例程序中我们分别提供了 consolerecord handler-直接把获取到的信息打印到控制台,和存放数据库的 方式-mysqlrecordhandler,当然你也可以分别提供基于文件的 实现。 首先来看我们系统的类图 四、具体成果形式和要求四、具体成果形式和要求 学年设计说明书和相关程序; 起止日期工作内容 7.9分析课题,寻找相关资料。 8.25-8.27学习相关知识,打下基础。 进 度 安 排 8.288.30设计解决方案并调试。 主 要 参 考 资 料 1windows 防火墙与网络封包截获技术 朱雁辉 编著 电子工业出版社 2监听与隐藏 求实科技 谭思亮 编著 人民邮电出 版社 3计算机网络安全基础 袁津生 吴砚农 编著 人民 邮电出版社 4visual c+ 6.0 技术内幕 美david j.kruglinski, scot wingo ,george shepherd 编著 希望图书 创作室 译 北京希望电子出版社 指导教师 意见(签字): 年 月 日 系(教研 室)主任 意见 (签字): 年 月 日 简单应用系统学年简单应用系统学年 设计说明书(或论文)设计说明书(或论文) (封面)(封面) 学院名称: 计算机与信息工程学院 班级名称: 网络工程 1 班 学生姓名: 学 号: 题 目: 基于 socket 的 http 请求监听程序的设计实现 指导教师 姓 名: 陈海宝 起止日期: 2015.7.92015.8.30 目录目录 1.选题背景.1 2.设计理念.1 2.1.课题要求1 2.2 课题分析2 2.3 课题解决方案.2 3. 过程论述.2 3.1 概要设计2 3.2启动 mysql,创建数据库和表7 4.结果分析.13 4.1 测试结果13 5.总结.19 附录20 致谢28 第一部分:正文部分第一部分:正文部分 一、选题背景一、选题背景 随着计算机的发展,越来越多的技术体现在现有的网络布局当中,并且起 到了引领计算机科技领域的作用。为了让学生了解基本网络构建的相关知识, 理解客户机,服务器的运行原理,因而选用了基于 socket 的 http 的请求监听 程序的设计这一课题来让学生自主的去理解这些网络知识。为了实现这一课题, 让本地机既作为客户机,又作为服务器来使用,能够让学生深刻了解服务器是 如何响应客户端的请求,并且监听指定的端口的。在此同时,也能让学生掌握 住一些基本的简单的设计网页的 html 语言和 jsp 语言的知识。 二、设计理念二、设计理念 1.1.课题要求课题要求 监听指定的端口,通过浏览器如 http:/localhost:7777 来访问时,可以 把请求到的内容记录下来,记录可以存文件,sqlit,mysql 数据库,然后把接 受到的信息在浏览器中显示出来。 2.2.课题分析课题分析 首先,监听指定端口可以采用监听服务器的端口号来实现;通过浏览器来 访问并把信息在浏览器中显示出来,这个可以建立一个简单的网站,然后由本 机的客户端来对服务器进行访问2,并且把访问的内容通过服务器发送给本机 的客户端,也就是采用 c/s 模式;记录可以存文件或者是数据库这一点,可以 通过 jdbc 的方式连接数据库,然后更新里面的内容。 3.3.课题解决方案课题解决方案 (1)相关软件:tomcat6.0(或 6.0 版本以上)、mysql5.0 数据库(其他 数据库也可)。 (2)设计思路:首先,安装并启动以上两个软件,在数据库中创建一个 student 数据库和两张表(可以用 mysql 相关的编辑软件制作表):user 表, information 表,在 information 表中加入一些数据;其次,用 txt 文本编写 jsp 文件和 tag 文件(也可以下载相关的 jsp 文件编辑软件),在 tag 文件中 添加数据库连接语句;最后,用浏览器进行测试。 (3)流程图如下: 登录登录 用户名是否存在用户名是否存在 开始开始 登录成功登录成功 查询查询 所查信息是否存在所查信息是否存在 显示信息显示信息 结束结束 注册注册 重建数据库信息重建数据库信息 是是 是是 否否 否否 图 2-3-1 总体流程图 三、过程论述三、过程论述 3.13.1 概要设计概要设计 httpserve 类是我们的核心类,他实现了 runnable 接口,因此有着更高的性能, 在循环中不断的去轮询指定端口,构造方法比较简单,只需要一个要监听的端 口号即可,还有两个用于触发监听和停止程序运行的方法 stop() import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import .serversocket; import .socket; import java.sql.date; import java.util.arraylist; import java.util.list; /* * 服务器监听对象,对某个端口进行监听,基于线程的实现 * * author kevin * */ public class httpserver implements runnable /* * 服务器监听 */ private serversocket serversocket; /* * 标志位,表示当前服务器是否正在运 行 */ private boolean isrunning; /* * 观察者 */ private list recordhandlers = new arraylist(); public httpserver(int port) try serversocket = new serversocket(port); catch (ioexception e) e.printstacktrace(); public void stop() this.isrunning = false; public void start() this.isrunning = true; new thread(this).start(); override public void run() while (isrunning) /一直监听,直到受到停止的命令 socket socket = null; try socket = serversocket.accept();/如果没有请求,会一直 hold 在这里等待, 有客户端请求的时候才会继续往下执行 / log bufferedreader bufferedreader = new bufferedreader( new inputstreamreader(socket.getinputstream();/获取输入流(请求) stringbuilder stringbuilder = new stringbuilder(); string line = null; while (line = bufferedreader.readline() != null record record = new record(); record.setrecord(stringbuilder.tostring(); record.setvisitdate(new date(system.currenttimemillis(); notifyrecordhandlers(record);/通知日志记录者对日志作操作 / echo printwriter printwriter = new printwriter( socket.getoutputstream(), true);/这里第二个参数表示自动刷新缓存 doecho(printwriter, record);/将日志输出到浏览器 / release printwriter.close(); bufferedreader.close(); socket.close(); catch (ioexception e) e.printstacktrace(); /* * 将得到的信写回客户端 * * param printwriter * param record */ private void doecho(printwriter printwriter, record record) printwriter.write(record.getrecord(); /* * 通知已经注册的监听者做处理 * * param record */ private void notifyrecordhandlers(record record) for (recordhandler recordhandler : this.recordhandlers) recordhandler.handlerecord(record); /* * 添加一个监听器 * * param recordhandler */ public void addrecordhandler(recordhandler recordhandler) this.recordhandlers.add(recordhandler); (2) record 类非常简单,只是作为参数传递的对象来用 package com.crazycoder2010.socket; import java.sql.date; public class record private int id; private string record; private date visitdate; public int getid() return id; public void setid(int id) this.id = id; public string getrecord() return record; public void setrecord(string record) this.record = record; public date getvisitdate() return visitdate; public void setvisitdate(date visitdate) this.visitdate = visitdate; (3) recordhandler 接口,统一监听接口,非常简单 package com.crazycoder2010.socket; /* * 获取到访问信息后的处理接口 * author kevin * */ public interface recordhandler public void handlerecord(record record); (4) consolerecordhandler 实现,直接 system 打印输出,在我们作测试时非常有 用 package com.crazycoder2010.socket; public class consolerecordhandler implements recordhandler override public void handlerecord(record record) system.out.println(“); system.out.println(record.getrecord(); (5) mysqlrecordhandler,数据库实现,定义了要对数据库操作所需要的几个基本 属性 url,username,password,加载驱动的程序我们放在了静态代码短中,这个东 东嘛,只要加载一次就 ok 了 package com.crazycoder2010.socket; import java.sql.connection; import java.sql.preparedstatement; import java.sql.sqlexception; public class mysqlrecordhandler implements recordhandler static try class.forname(“com.mysql.jdbc.driver“); catch (classnotfoundexception e) e.printstacktrace(); private static final string new_record = “insert into log(record,visit_date) valu es (?,?)“; /* * 数据库访问 url */ private string url; /* * 数据库用户名 */ private string username; /* * 数据库密码 */ private string password; public void seturl(string url) this.url = url; public void setusername(string username) this.username = username; public void setpassword(string password) this.password = password; override public void handlerecord(record record) connection connection = connectionfactory.getconnection(url, username, password); preparedstatement preparedstatement = null; try preparedstatement = connection.preparestatement(new_record); preparedstatement.setstring(1, record.getrecord(); preparedstatement.setdate(2, record.getvisitdate(); preparedstatement.executeupdate(); catch (sqlexception e) e.printstacktrace(); finally connectionfactory.release(preparedstatement); connectionfactory.release(connection); (6)connectionfactory 类,我们的数据库连接工厂类,定义了几个常用的方法, 把数据库连接独立到外部单独类的好处在于,我们可以很灵活的替换连接的生 成方式-如我们可以从连接池中获取一个,而我们的数据库操作却只关注 connection 本身,从而达到动静分离的效果 package com.crazycoder2010.socket; import java.sql.connection; import java.sql.drivermanager; import java.sql.preparedstatement; import java.sql.sqlexception; /* * 创建数据库连接的工厂类 * * author kevin * */ public class connectionfactory public static connection getconnection(string url, string username, string password) try return drivermanager.getconnection(url, username, password); catch (sqlexception e) e.printstacktrace(); return null; /* * 释放连接 * * param connection */ public static void release(connection connection) if (connection != null) try connection.close(); connection = null; catch (sqlexception e) e.printstacktrace(); /* * 关闭查询语句 * * param preparedstatement */ public static void release(preparedstatement preparedstatement) if (preparedstatement != null) try preparedstatement.close(); preparedstatement = null; catch (sqlexception e) e.printstacktrace(); (7) init.sql 我们的数据库建表脚本,只是为了演示,一个表就好 create table logs.log ( id int(10) not null auto_increment, record varchar(1024) not null, visit_date datetime not null, primary key (id) ) engine = myisam; (8)appluancher 类,是时候把这几个模块高到一起跑起来的时候了,我们首 先创建了一个服务器端,然后给服务器创建了两个监听器,然后启动服务器, 这个时候我们的 httpserver 已经开始监听 7777 端口了! package com.crazycoder2010.socket; public class applauncher /* * param args */ public static void main(string args) httpserver httpserver = new httpserver (7777); httpserver.addrecordhandler(new consolerecordhandler(); httpserver.addrecordhandler(createmysqlhandler(); httpserver.start(); private static recordhandler createmysqlhandler() mysqlrecordhandler handler = new mysqlrecordhandler(); handler.seturl(“jdbc:mysql:/localhost:3306/logs“); handler.setusername(“root“); handler.setpassword(“); return handler; (9)打开浏览器,输入 http:/localhost:7777 我们看到控制台输出了一堆的文字 get / http/1.1 host: localhost:7777 connection: keep-alive cache-control: max-age=0 user-agent: mozilla/5.0 (x11; u; linux i686; en-us) applewebkit/534.16 (khtml, like gecko) chrome/10.0.648.127 safari/534.16 accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/ *;q=0.5 accept-encoding: gzip,deflate,sdch accept-language: zh-cn,zh;q=0.8 accept-charset: gbk,utf-8;q=0.7,*;q=0.3 3.23.2 mysqlmysql,创建数据库和表,创建数据库和表 创建 student 数据库,user 表和 information 表。 图 3-2-1 创建表 图 3-2-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论