PDA数据传输功能的分析、实现
WangYanCheng (ybygjy#gmail.com)
2010年12月22日
文章内容描述了实现应用系统数据的传输的一种方法,主要内容包括:
、
一、场景描述
1、PDA应用程序系统环境:
2、服务器端应用系统环境:JavaEE典型Web应用系统
3、应用场景:
4、目标要求:
二、策略以及分析、实现思路
1、JavaEE应用系统:增加PDA管理专用功能模块,提供基于HTTP协议的访问入口。
2、PDA应用系统:封装通信数据传输功能模块,负责实现数据与外部系统的交互。
|
3、顺序图:
|
三、技术知识点
- 事件处理机制与观察者模式
- 事件委托回调机制
- 字节流基础操作
四、实现
JavaEE部分
代码片断:
/**
* 下载
* @param response response
*/
private void download4PDA(HttpServletResponse response) {
OutputStream ous = null;
try {
ous = response.getOutputStream();
File file = new File("F://tools//java//install//jdk-6u23-ea-src-b01-jrl-30_aug_2010.jar");
WritableByteChannel rbc = Channels.newChannel(ous);
response.setContentLength((int) file.length());
FileChannel fc = new FileInputStream(file).getChannel();
ByteBuffer buffer = ByteBuffer.allocate(512);
while (fc.read(buffer) != -1) {
buffer.flip();
rbc.write(buffer);
buffer.clear();
}
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
if (ous != null) {
try {
ous.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
注意事项:
|
PDA部分
因为数据传输应用模块必须基于设备底层通信支持模块,所以针对特定场景会有不同策略的实现。这里只是描述了HTTP请求方式的一种简单实现
代码片断:
while ((flag = stream.Read(buffer, 0, buffer.Length)) != 0)
{
fileStream.Write(buffer, 0, flag);
addUp += flag;
dtiInst.OnDataTransferNotify(new DataSwitchArgs(contentLen, addUp, true));
//因网络环境不同,所以这里要考虑延时策略.因为如果网络太好的情况,如:(localhost)呈现进度频率就非常高根本看不到。
do
{
flag++;
} while (flag < 9999);
flag = 0;
}
fileStream.Close();
dtiInst.OnDataTransferNotify(new DataSwitchArgs(0, 0, true));
}
catch
{
dtiInst.OnDataTransferNotify(new DataSwitchArgs(true, false));
}
finally
{
if (null != stream)
{
try
{
stream.Close();
}
catch
{
}
}
if (null != fileStream)
{
try
{
fileStream.Close();
}
catch
{
}
}
}
}
private void innerSendData(System.IO.Stream stream, System.IO.FileInfo fileInfo)
{
System.IO.FileStream readStream = fileInfo.OpenRead();
byte[] buffer = new byte[256];//限制内存占用
int flag = 0, finishCount = 0, totalCount = (int)fileInfo.Length;
while ((flag = readStream.Read(buffer, 0, buffer.Length)) != 0)
{
stream.Write(buffer, 0, flag);
finishCount += flag;
dtiInst.OnDataTransferNotify(new DataSwitchArgs(totalCount, finishCount));
}
readStream.Close();
}
private String innerReceiveData(System.IO.Stream stream)
{
if (stream == null)
{
return String.Empty;
}
byte[] buffer = new byte[256];
int flag = 0;
StringBuilder sbud = new StringBuilder();
Encoding encoder = UTF8Encoding.UTF8;
while ((flag = stream.Read(buffer, 0, buffer.Length)) != 0)
{
sbud.Append(encoder.GetString(buffer, 0, flag));
}
stream.Close();
return sbud.ToString();
}
}
|
注意事项:
测试截图
|
五、小结
通过使用委托机制可以容易的实现对某一资源状态的监听,委托机制的一个优点就是可以轻松实现异步方式。有时也会考虑到直接利用多线程机制完成类似功能,但那样程序复杂性、开发成本、相关投入都会提高。