3.3. 数据传输子模块的实现
该模块以组件的形式提供给用户,属于DCOM范畴内的实现。用户只需要在其网络服务器上完成该组件注册,就可以根据该组件的调用说明进行数据传输的实现。
图三:数据传输子模块实现流程
该模块的开发使用ATL,下面阐述具体开发过程:
1>. 基于Visual C++(www.cppentry.com) 6.0工具建立ATL工程,本文将其定名为dbftp,组件基于MFC类进行编写,载体为动态链接文件并新建COM 接口提供外部调用;
2>. 建新ATL类,本文定类名ftpmdb。因为要编写的是进程内服务器,在用户调用时起作用,所以新建的ATL类提供了可以方便用户定制的COM接口--Iftpmdb;
3>. 定制COM接口的方法和属性,增加方法getmdb,属性errorstring,方法函数是数据传输的实现,属性是出错原因,因此,外部调用时,使用getmdb方法以后,需读取errorstring获得调用结果。最后,在ftpmdb类中添加CComBSTR类型的成员变量errorstring;
4>. 进入getmdb函数添加执行代码,另外,需注意此函数所在文件需将MFC中负责网络通信类的头文件afxinet.h包含入内,函数算法按步骤简述如下:
1)接口提供连接和本地配置信息,为BSTR类型字符串,需转换为CString类型,以方便向MFC的网络类函数传递参数,示例如:
2)需建立新的Internet会话并进行FTP连接,同时可以开始接收连接错误代码,如下:
CInternetSession * session=new CInternetSession; CFtpConnection * conn; try { conn=session->GetFtpConnection(serverip,user,pwd); /*进行ftp连接*/ } catch (CInternetException* pEx) { TCHAR szErr[1024]; if (pEx->GetErrorMessage(szErr, 1024)){ conn = NULL; errorstring.Empty(); errorstring.Append("连接字符有误! "); errorstring.Append(szErr); return S_FALSE; } /*获得异常,写errorstring采用Append方法*/ pEx->Delete(); } |
3)设定当前服务器上Ftp目录,Wininet函数为:
conn->SetCurrentDirectory(serverdir)); |
4)寻找标志文件打开获取标志以确定状态,决定是否传输:
CFtpFileFind flagfind(conn); flagfind.FindFile("flagout.txt") CInternetFile * dbfile=conn->OpenFile("flagout.txt"); //从文件中读取标志位 dbfile->Read(flag,1); dbfile->Close(); if(flag[0]=='0'){/*标志为0不需传输*/ return S_FALSE; } |
5)获取远程过渡数据库文件,Wininet函数为:
conn->GetFile(fname,localdir+fname,false)) |
6)重置标志为0,写回服务器端标志文件,完成传输,结束会话:
flag[0]='0'; dbfile=conn->OpenFile("flagout.txt",GENERIC_WRITE); dbfile->Write(flag,1); dbfile->Close(); conn->Close(); session->Close(); |
5>. 编译后产生目标文件dbftp.dll,该文件即是组件的载体;
6>. 在其他服务器上注册该组件:将DLL复制到服务器的Winnt\System32目录中,注册命令行为:regsvr32 dbftp.dll,注册成功后在注册表中可以查询到Dbftp.ftpmdb的键,此即在创建服务器组件对象需使用的字符串。
上述六个步骤阐明开发并注册组件的过程,下面说明在网络编程(www.cppentry.com)中对其进行调用的方法,以ASP为例,阐述调用过程。
以request方法获得连接信息,如:
创建服务器组件对象并调用方法进行传输:
set tempdb=server.CreateObject("dbftp.ftpmdb") tempdb.getmdb url,uid,pwd,servpath,"temp.mdb",localpath |
读取组件的errorstring属性,以response方法输出结果:
Response.Write tempdb.errorstring |
以上即为数据传输子模块的详细实现。
4. 总结
本文提出的企业网间数据共享机制解决了基于Internet的不同数据库产品之间的连接问题,同时给用户在数据共享方面提供很大的选择空间,提供的良好界面以及操作整合,降低了对网络管理人员在专业领域知识上的要求,提高了数据共享的实时性和工作效率。但本方法并未对传输的数据文件进行加密,所以在该方面的问题还有待解决。
|