基于Socket的HTTP的请求监听程序的设计Word文档格式.docx
- 文档编号:21723873
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:19
- 大小:829.90KB
基于Socket的HTTP的请求监听程序的设计Word文档格式.docx
《基于Socket的HTTP的请求监听程序的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于Socket的HTTP的请求监听程序的设计Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
度
安
排
起止日期
工作内容
7.9
分析课题,寻找相关资料。
8.25-8.27
学习相关知识,打下基础。
8.28——8.30
设计解决方案并调试。
主
要
参
考
资
料
[1]《Windows防火墙与网络封包截获技术》朱雁辉编著电子工业出版社
[2]《监听与隐藏》求实科技谭思亮编著人民邮电出版社
[3]《计算机网络安全基础》袁津生吴砚农编著人民邮电出版社
[4]《VisualC++6.0技术内幕》[美]DavidJ.Kruglinski,ScotWingo,GeorgeShepherd编著希望图书创作室译北京希望电子出版社
指导教师
意见
(签字):
年月日
系(教研室)主任意见
简单应用系统学年设计说明书(或论文)
(封面)
学院名称:
计算机与信息工程学院
班级名称:
网络工程1班
学生姓名:
学号:
题目:
基于Socket的HTTP请求监听程序的设计实现
姓名:
陈海宝
起止日期:
2015.7.9—2015.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.课题要求
2.课题分析
首先,监听指定端口可以采用监听服务器的端口号来实现;
通过浏览器来访问并把信息在浏览器中显示出来,这个可以建立一个简单的网站,然后由本机的客户端来对服务器进行访问[2],并且把访问的内容通过服务器发送给本机的客户端,也就是采用C/S模式;
记录可以存文件或者是数据库这一点,可以通过JDBC的方式连接数据库,然后更新里面的内容。
3.课题解决方案
(1)相关软件:
Tomcat6.0(或6.0版本以上)、MySQL5.0数据库(其他数据库也可)。
(2)设计思路:
首先,安装并启动以上两个软件,在数据库中创建一个Student数据库和两张表(可以用MySQL相关的编辑软件制作表):
user表,information表,在information表中加入一些数据;
其次,用txt文本编写JSP文件和Tag文件(也可以下载相关的JSP文件编辑软件),在Tag文件中添加数据库连接语句;
最后,用浏览器进行测试。
(3)流程图如下:
图2-3-1总体流程图
三、过程论述
3.1概要设计
httpServe类是我们的核心类,他实现了Runnable接口,因此有着更高的性能,在循环中不断的去轮询指定端口,构造方法比较简单,只需要一个要监听的端口号即可,还有两个用于触发监听和停止程序运行的方法stop()&
start(),这两个方法也比较简单,只是简单的给标志位赋值即可,我们这个程序是基于Oserver模式的简化版本,HttpServer本身是一个被观察的对象(Subject),当这个Subject有变化时(获取到客户端请求时)要通知监听器(我们的RecordHandler)去作操作(写数据库还是写文件或是直接控制台输出),极大增加了系统的灵活性和易测试性
(1)HttpServer类代码
package
com.crazycoder2010.socket;
import
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
java.io.PrintWriter;
.ServerSocket;
.Socket;
java.sql.Date;
java.util.ArrayList;
java.util.List;
/**
*
服务器监听对象,对某个端口进行监听,基于线程的实现
@author
Kevin
*/
public
class
HttpServer
implements
Runnable
{
服务器监听
private
ServerSocket
serverSocket;
标志位,表示当前服务器是否正在运行
boolean
isRunning;
观察者
List<
RecordHandler>
recordHandlers
=
new
ArrayList<
();
HttpServer(int
port)
try
serverSocket
ServerSocket(port);
}
catch
(IOException
e)
e.printStackTrace();
void
stop()
this.isRunning
false;
start()
true;
Thread(this).start();
@Override
run()
while
(isRunning)
{//一直监听,直到受到停止的命令
Socket
socket
null;
serverSocket.accept();
//如果没有请求,会一直hold在这里等待,有客户端请求的时候才会继续往下执行
//
log
BufferedReader
bufferedReader
BufferedReader(
InputStreamReader(socket.getInputStream()));
//获取输入流(请求)
StringBuilder
stringBuilder
StringBuilder();
String
line
((line
bufferedReader.readLine())
!
null
&
line.equals("
"
))
{//得到请求的内容,注意这里作两个判断非空和"
都要,只判断null会有问题
stringBuilder.append(line).append("
/n"
);
Record
record
Record();
record.setRecord(stringBuilder.toString());
record.setVisitDate(new
Date(System.currentTimeMillis()));
notifyRecordHandlers(record);
//通知日志记录者对日志作操作
echo
PrintWriter
printWriter
PrintWriter(
socket.getOutputStream(),
true);
//这里第二个参数表示自动刷新缓存
doEcho(printWriter,
record);
//将日志输出到浏览器
release
printWriter.close();
bufferedReader.close();
socket.close();
将得到的信写回客户端
@param
doEcho(PrintWriter
printWriter,
record)
printWriter.write(record.getRecord());
通知已经注册的监听者做处理
notifyRecordHandlers(Record
for
(RecordHandler
recordHandler
:
this.recordHandlers)
recordHandler.handleRecord(record);
添加一个监听器
addRecordHandler(RecordHandler
recordHandler)
this.recordHandlers.add(recordHandler);
(2)Record类非常简单,只是作为参数传递的对象来用
int
id;
record;
Date
visitDate;
getId()
return
setId(int
id)
this.id
getRecord()
setRecord(String
this.record
getVisitDate()
setVisitDate(Date
visitDate)
this.visitDate
(3)RecordHandler接口,统一监听接口,非常简单
获取到访问信息后的处理接口
interface
RecordHandler
handleRecord(Record
(4)ConsoleRecordHandler实现,直接System打印输出,在我们作测试时非常有用
ConsoleRecordHandler
System.out.println("
@@@@@@@"
System.out.println(record.getRecord());
(5)MysqlRecordHandler,数据库实现,定义了要对数据库操作所需要的几个基本属性url,username,password,加载驱动的程序我们放在了静态代码短中,这个东东嘛,只要加载一次就ok了
java.sql.Connection;
java.sql.PreparedStatement;
java.sql.SQLException;
MysqlRecordHandler
static
Class.forName("
com.mysql.jdbc.Driver"
(ClassNotFoundException
final
NEW_RECORD
insert
into
log(record,visit_date)
values
(?
?
)"
;
数据库访问url
url;
数据库用户名
username;
数据库密码
password;
setUrl(String
url)
this.url
setUsername(String
username)
this.username
setPassword(String
password)
this.password
Connection
connection
ConnectionFactory.getConnection(url,
username,
password);
PreparedStatement
preparedStatement
connection.prepareStatement(NEW_RECORD);
preparedStatement.setString(1,
record.getRecord());
preparedStatement.setDate(2,
record.getVisitDate());
preparedStatement.executeUpdate();
(SQLException
finally
ConnectionFactory.release(preparedStatement);
ConnectionFactory.release(connection);
(6)ConnectionFactory类,我们的数据库连接工厂类,定义了几个常用的方法,把数据库连接独立到外部单独类的好处在于,我们可以很灵活的替换连接的生成方式--如我们可以从连接池中获取一个,而我们的数据库操作却只关注Connection本身,从而达到动静分离的效果
java.sql.DriverManager;
创建数据库连接的工厂类
ConnectionFactory
getConnection(String
url,
DriverManager.getConnection(url,
释放连接
release(Connection
connection)
if
(connection
null)
connection.close();
关闭查询语句
release(PreparedStatement
preparedStatement)
(preparedStatement
preparedStatement.close();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Socket HTTP 请求 监听 程序 设计