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

原文:http://www.blogjava.net/rochoc/archive/2009/01/09/250739.html

 

上次写完(一)实现总体说明后,一直想把源码放上来,但一直没有时间,今天趁周末把这个写完整,今天主要是附上实现源码,供有需要的朋友参考,当然也希望大家多多指教。上篇文章讲到了这个实现是基于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 :

/** *//********************************************************************
   * 项目名称                :rochoc<p>
   * 包名称                  :com.rochoc.autoupdate<p>
   * 文件名称                :AutoUpdProtocol.java<p>
   * 编写者                 :kfzx-luoc<p>
   * 编写日期                :2008-12-22<p>
   * 程序功能(类)描述    :<p>
   * 定义自动升级客户端与服务端的通讯协议
   * 程序变更日期            :
  * 变更作者                :
  * 变更说明                :
 ********************************************************************/
 package com.rochoc.autoupdate;
 
 /** *//**
  * @author kfzx-luoc
  *
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
  */
 public class AUPD
 {
     /** *//**
      * 无意义操作
      */
     public static final String NONE = "NONE    ";
     
     /** *//**
      * 发送客户端版本信息
      */
     public static final String SEND_CLIENT_VERSION = "SENDCVER";
     
     /** *//**
      * 接收客户端版本信息
      */
     public static final String RECEIVED_CLIENT_VERSION = "RECDCVER";
     
     /** *//**
      * 发送文件全路径
      */
     public static final String SEND_FILE_ABSOULT = "SENDFILE";
     
     /** *//**
      * 接收文件全路径
      */
     public static final String RECEIVED_FILE_ABSOULT = "RECDFILE";
     
     /** *//**
      * 开始文件传输
      */
     public static final String START_TRANSMIT = "STARTTSM";
     
     /** *//**
      * 结束文件传输
      */
     public static final String TERMINATE_TRANSMIT = "TERMTSMT";
     
     /** *//**
      * 更新失败
      */
     public static final String UPDATED_FAILURE = "UPDEFAIL";
     
     /** *//**
      * 更新成功
      */
     public static final String UPDATED_SUCCESSFUL = "UPDESUCC";
    
     /** *//**
      * 无需更新
      */
     public static final String NOTNEED_UPDATED = "NNEEDUPD";
     
     /** *//**
      * 已经准备好接收更新文件
      */
     public static final String READY_TO_UPDATE = "READYTUP";
     
     /** *//**
      * 结束链接
      */
     public static final String BYE = "BYEBYEOK";
     
     /** *//**
      * 数据区OFFSET
      */
     public static final int DATA_OFFSET = 5;    
 
     /** *//**
      * 文件数据块大小
      */
     public static final int DATA_SIZE = 1024;
 
     /** *//**
      * 发送缓冲区大小
      */
     public static final int BUFFER_SIZE = DATA_SIZE + 1 + 4; // [0]位是标志位,区分数据和命令 + 4位长度
 
     /** *//**
      * 数据段标识
     */
    public static final int MARK_DATA_SECT = 0;
    /** *//**
     * 命令段标识
     */
    public static final int CMD_DATA_SECT = 1;

    /** *//**
     * 数据段结束标识
     */
    public static final int MARK_DATA_END = 127;
}

 

AutoUpdateServer.java :

 

/** *//********************************************************************
   * 项目名称                :rochoc<p>
   * 包名称                  :com.rochoc.autoupdate<p>
   * 文件名称                :AutoUpdateServer.java<p>
   * 编写者                 :kfzx-luoc<p>
   * 编写日期                :2008-12-22<p>
   * 程序功能(类)描述    :<p>
   * 自动更新服务端
   * 程序变更日期            :
  * 变更作者                :
  * 变更说明                :
 ********************************************************************/
 package com.rochoc.autoupdate;
 
 import java.io.IOException;
 import java.net.ServerSocket;
 import java.net.Socket;
 
 /** *//**
  * @author kfzx-luoc
  *
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
  */
 public class AutoUpdateServer extends Thread
 {
     private int port = 0;//服务端口号
     private Config config = Config.getInstance();//配置文件对像
     private ServerSocket srvSocket = null;
     public AutoUpdateServer()
     {
         port = Integer.parseInt(config.getServerPort());
         try
         {
             srvSocket = new ServerSocket(port);
             //setTimeout(60000);
             this.start();
             Config.print("自动更新服务器在端口'"+port+"'监听");
         } catch (IOException e)
         {
             e.printStackTrace();
         }
     }
     void setTimeout(int millis) throws IOException
     {
         if (srvSocket != null)
         {
             srvSocket.setSoTimeout(millis);
         }
     }
     void close() throws IOException
     {
         if (srvSocket != null)
         {
             srvSocket.close();
         }
    }
     /** *//**
      * @author kfzx-luoc
      *
      * 执行监听处理,如果有客户端连接上来,则判断是否需要更新,
      * 如果需要更新,则给客户端传送最新版本文件
      */
     public void run()
     {
         try
        {
             while (true) 
             {
                 Socket clSocket = null;
                 try
                 {
                     clSocket = srvSocket.accept();
                     Config.print("客户端‘"+clSocket.getInetAddress()+"’连接成功");
                     //进行处理
                     AUpdSrvProc srvP = new AUpdSrvProc(clSocket);
                     srvP.start();
                 } catch (IOException ioe)
                 {
                     try
                     {
                         clSocket.close();
                     } catch (IOException e1)
                     {
                     }
                     Config.print("AutoUpdateServer proc client:"+clSocket.getInetAddress().getHostAddress()+" error,"+ioe);
                     ioe.printStackTrace();
                 }
             }
         }catch(Exception e)
         {
             Config.print("AutoUpdateServer running error,"+e);
             e.printStackTrace();
         } finally
         {
             try
             {
                 srvSocket.close();
             } catch (IOException e)
            {
            }
        }
    }    
    //测试主函数
    public static void main(String args[])
    {
        AutoUpdateServer server = new AutoUpdateServer();
        server.run();
    }
}

 

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

运行服务端:
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

你可能感兴趣的:(java,数据结构,.net,socket,软件测试)