首先来看以下我们的需求:
用java编写一个监听程序,监听指定的端口,通过浏览器如http://localhost:7777来访问时,可以把请求到的内容记录下来,记录可以存文件,sqlit,mysql数据库,然后把接受到的信息在浏览器中显示出来
要点:
Socket,线程,数据库,IO操作,观察者模式
来看下我们如何来设计这个小系统,这个系统包含三部分的内容,一个是监听端口,二是记录日志,三是数据回显,端口监听第一想到的就是Socket编程了,数据回显也是一样的,无非是把当前请求客户端的socket获取到,然后把消息通过流输出出去,日志的记录因为是要多种实现策略,这里我们使用了一个观察者模式来实现,服务器可以添加任意多个观察着,因此有着很灵活的扩展性,在实例程序中我们分别提供了ConsoleRecordHandler--直接把获取到的信息打印到控制台,和存放数据库的方式-MysqlRecordHandler,当然你也可以分别提供基于文件的实现。
首先来看我们系统的类图
HttpServer类是我们的核心类,他实现了Runnable接口,因此有着更高的性能,在循环中不断的去轮询指定端口,构造方法比较简单,只需要一个要监听的端口号即可,还有两个用于触发监听和停止程序运行的方法stop()&start(),这两个方法也比较简单,只是简单的给标志位赋值即可,我们这个程序是基于Oserver模式的简化版本,HttpServer本身是一个被观察的对象(Subject),当这个Subject有变化时(获取到客户端请求时)要通知监听器(我们的RecordHandler)去作操作(写数据库还是写文件或是直接控制台输出),极大的增加了系统的灵活性和易测试性
HttpServer类代码
[java] view plaincopyprint?
- package com.crazycoder2010.socket;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.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