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