CS结构软件自动升级实现(二)

CS结构软件自动升级实现(二)
上次写完(一)实现总体说明后,一直想把源码放上来,但一直没有时间,今天趁周末把这个写完整,今天主要是附上实现源码,供有需要的朋友参考,当然也希望大家多多指教。上篇文章讲到了这个实现是基于SOCKET实现的,当然通讯协议是自定义,上一篇也有朋友说采用http协议比较简单,当然这个也是一种方法,但要使用http协议,则服务端要有http服务这样会导致服务端过于庞大。

本实现包括:
1、AUPD.java  服务端和客户端之间的通讯协议
2、AutoUpdateServer.java 服务端的监听进程
3、AUpdSrvProc.java服务端的服务线程,用于处理客户端的自动升级请求
4、ClientVerParser.java服务端服务线程用于解决客户端版本信息的类
5、AutoUpdateClient.java客户端的自动升级请求进程
6、Config.java用于服务端和客户端读取本地配制文件的类
7、UpdFile.java用于文件传输的文件对像
本实现用dom4j作为解释xml的引擎

AUPD.java :
  1 /** */ /********************************************************************
  2 * 项目名称                :rochoc<p>
  3 * 包名称                  :com.rochoc.autoupdate<p>
  4 * 文件名称                :AutoUpdProtocol.java<p>
  5 * 编写者                 :kfzx-luoc<p>
  6 * 编写日期                :2008-12-22<p>
  7 * 程序功能(类)描述    :<p>
  8 * 定义自动升级客户端与服务端的通讯协议
  9 * 程序变更日期            :
 10 * 变更作者                :
 11 * 变更说明                :
 12********************************************************************/

 13 package  com.rochoc.autoupdate;
 14
 15 /** */ /**
 16 * @author kfzx-luoc
 17 *
 18 * TODO To change the template for this generated type comment go to
 19 * Window - Preferences - Java - Code Style - Code Templates
 20 */

 21 public   class  AUPD
 22 {
 23    /** *//**
 24     * 无意义操作
 25     */

 26    public static final String NONE = "NONE    ";
 27    
 28    /** *//**
 29     * 发送客户端版本信息
 30     */

 31    public static final String SEND_CLIENT_VERSION = "SENDCVER";
 32    
 33    /** *//**
 34     * 接收客户端版本信息
 35     */

 36    public static final String RECEIVED_CLIENT_VERSION = "RECDCVER";
 37    
 38    /** *//**
 39     * 发送文件全路径
 40     */

 41    public static final String SEND_FILE_ABSOULT = "SENDFILE";
 42    
 43    /** *//**
 44     * 接收文件全路径
 45     */

 46    public static final String RECEIVED_FILE_ABSOULT = "RECDFILE";
 47    
 48    /** *//**
 49     * 开始文件传输
 50     */

 51    public static final String START_TRANSMIT = "STARTTSM";
 52    
 53    /** *//**
 54     * 结束文件传输
 55     */

 56    public static final String TERMINATE_TRANSMIT = "TERMTSMT";
 57    
 58    /** *//**
 59     * 更新失败
 60     */

 61    public static final String UPDATED_FAILURE = "UPDEFAIL";
 62    
 63    /** *//**
 64     * 更新成功
 65     */

 66    public static final String UPDATED_SUCCESSFUL = "UPDESUCC";
 67    
 68    /** *//**
 69     * 无需更新
 70     */

 71    public static final String NOTNEED_UPDATED = "NNEEDUPD";
 72    
 73    /** *//**
 74     * 已经准备好接收更新文件
 75     */

 76    public static final String READY_TO_UPDATE = "READYTUP";
 77    
 78    /** *//**
 79     * 结束链接
 80     */

 81    public static final String BYE = "BYEBYEOK";
 82    
 83    /** *//**
 84     * 数据区OFFSET
 85     */

 86    public static final int DATA_OFFSET = 5;    
 87
 88    /** *//**
 89     * 文件数据块大小
 90     */

 91    public static final int DATA_SIZE = 1024;
 92
 93    /** *//**
 94     * 发送缓冲区大小
 95     */

 96    public static final int BUFFER_SIZE = DATA_SIZE + 1 + 4// [0]位是标志位,区分数据和命令 + 4位长度
 97
 98    /** *//**
 99     * 数据段标识
100     */

101    public static final int MARK_DATA_SECT = 0;
102    /** *//**
103     * 命令段标识
104     */

105    public static final int CMD_DATA_SECT = 1;
106
107    /** *//**
108     * 数据段结束标识
109     */

110    public static final int MARK_DATA_END = 127;
111}

112

AutoUpdateServer.java :
  1 /** */ /********************************************************************
  2 * 项目名称                :rochoc<p>
  3 * 包名称                  :com.rochoc.autoupdate<p>
  4 * 文件名称                :AutoUpdateServer.java<p>
  5 * 编写者                 :kfzx-luoc<p>
  6 * 编写日期                :2008-12-22<p>
  7 * 程序功能(类)描述    :<p>
  8 * 自动更新服务端
  9 * 程序变更日期            :
 10 * 变更作者                :
 11 * 变更说明                :
 12********************************************************************/

 13 package  com.rochoc.autoupdate;
 14
 15 import  java.io.IOException;
 16 import  java.net.ServerSocket;
 17 import  java.net.Socket;
 18
 19 /** */ /**
 20 * @author kfzx-luoc
 21 *
 22 * TODO To change the template for this generated type comment go to
 23 * Window - Preferences - Java - Code Style - Code Templates
 24 */

 25 public   class  AutoUpdateServer  extends  Thread
 26 {
 27    private int port = 0;//服务端口号
 28    private Config config = Config.getInstance();//配置文件对像
 29    private ServerSocket srvSocket = null;
 30    public AutoUpdateServer()
 31    {
 32        port = Integer.parseInt(config.getServerPort());
 33        try
 34        {
 35            srvSocket = new ServerSocket(port);
 36            //setTimeout(60000);
 37            this.start();
 38            Config.print("自动更新服务器在端口'"+port+"'监听");
 39        }
 catch (IOException e)
 40        {
 41            e.printStackTrace();
 42        }

 43    }

 44    void setTimeout(int millis) throws IOException
 45    {
 46        if (srvSocket != null)
 47        {
 48            srvSocket.setSoTimeout(millis);
 49        }

 50    }

 51    void close() throws IOException
 52    {
 53        if (srvSocket != null)
 54        {
 55            srvSocket.close();
 56        }

 57    }

 58    /** *//**
 59     * @author kfzx-luoc
 60     *
 61     * 执行监听处理,如果有客户端连接上来,则判断是否需要更新,
 62     * 如果需要更新,则给客户端传送最新版本文件
 63     */

 64    public void run()
 65    {
 66        try
 67        {
 68            while (true
 69            {
 70                Socket clSocket = null;
 71                try
 72                {
 73                    clSocket = srvSocket.accept();
 74                    Config.print("客户端‘"+clSocket.getInetAddress()+"’连接成功");
 75                    //进行处理
 76                    AUpdSrvProc srvP = new AUpdSrvProc(clSocket);
 77                    srvP.start();
 78                }
 catch (IOException ioe)
 79                {
 80                    try
 81                    {
 82                        clSocket.close();
 83                    }
 catch (IOException e1)
 84                    {
 85                    }

 86                    Config.print("AutoUpdateServer proc client:"+clSocket.getInetAddress().getHostAddress()+" error,"+ioe);
 87                    ioe.printStackTrace();
 88                }

 89            }

 90        }
catch(Exception e)
 91        {
 92            Config.print("AutoUpdateServer running error,"+e);
 93            e.printStackTrace();
 94        }
 finally
 95        {
 96            try
 97            {
 98                srvSocket.close();
 99            }
 catch (IOException e)
100            {
101            }

102        }

103    }
    
104    //测试主函数
105    public static void main(String args[])
106    {
107        AutoUpdateServer server = new AutoUpdateServer();
108        server.run();
109    }

110}

111

避免太大,其他源码见(三)

运行服务端:
java -cp .;.\bin;.\lib\dom4j-1.6.1.jar;.\lib\jaxen-1.1-beta-4.jar com.icbc.autoupdate.AutoUpdateServer
运行客户端:
java -cp ./bin;./lib/jaxen-1.1-beta-4.jar;./lib/dom4j-1.6.1.jar; com.icbc.autoupdate.AutoUpdateClient

你可能感兴趣的:(CS结构软件自动升级实现(二))