E013

调用orsci-art中的ARTStar,实现分布式网络编程演示。

 

#include "stdafx.h"
#include "Test_ARTStar.h"
#include "artStar.h"
#include <fstream>
#include "JWTime.h"
using namespace orsci;

namespace __Test_ARTStar__
{
using namespace art;

FILE * desFile;

int xxyy = 0;

int recvFileSize = 0;


class TMyARTStar : public TARTStar
{
private:

public:
TMyARTStar(const EARTExeServiceMode AARTExeMode = eaem_StarParallel) : TARTStar(AARTExeMode)
{
}
~TMyARTStar() {}

public:
virtual void OnARTLogin(const int & AARTID, const string & APeerIP, const TPORTTYPE & APeerPort) override
{
cout << "[OnARTLogin]收到一个新的用户加入:" << AARTID << "\t" << APeerIP << " : " << APeerPort << endl;

} //哪个Star连接了。
virtual void OnARTLogout(const int & AARTID, const string & APeerIP, const TPORTTYPE & APeerPort) override
{
cout << "[OnARTLogout]收到一个用户注销:" << AARTID << "\t" << APeerIP << " : " << APeerPort << endl;
} //哪个Star断开了。
virtual void OnCenterDisconnected(const string & APeerIP, const TPORTTYPE & APeerPort)
{
cout << "OnCenterDisconnected:" << APeerIP << " : " << APeerPort << endl;
}
public:
virtual void OnReceiveP2P(const string & APeerIP, const TPORTTYPE & APeerPort, TPIPEComPackage * & pRecvPackage)
{ //本事件触发接收一个PIPECom包
//cout << "[ART]收到P2P包:IP地址" << APeerIP << " -- 端口 " << APeerPort << " 包大小: " << pRecvPackage->headlen + pRecvPackage->size() << endl;
//cout << pRecvPackage->readstring() << endl;
//TPIPEComPackagePool::LaybackPackage(pRecvPackage); //测试外界释放的效果!
xxyy ++;
return;

recvFileSize += pRecvPackage->size();
if (xxyy == 1){ fwrite(pRecvPackage->bodybuf, sizeof(char), pRecvPackage->size(), desFile); fflush(desFile);}
else cout << "[ART]a收到P2P包:IP地址" << APeerIP << " -- 端口 " << APeerPort << " 包大小: " << pRecvPackage->ct_headlen + pRecvPackage->size() << endl;
//desFile << pRecvPackage->readstring();
//desFile << endl;
} //当接收到数据时
virtual void OnReceivePIPE(const string & APeerIP, const TPORTTYPE & APeerPort, const unsigned int APipeIndex, TPIPEComPackage * & pRecvPackage)
{
xxyy++;
return;

recvFileSize += pRecvPackage->size();
if ((xxyy == 1) && (APipeIndex == 2)) {fwrite(pRecvPackage->bodybuf, sizeof(char), pRecvPackage->size(), desFile); fflush(desFile);}
else
cout << "[MyART]收到PIPE包,来自管道 " << APipeIndex << " :IP地址" << APeerIP << " -- 端口 " << APeerPort << " 包大小: " << pRecvPackage->ct_headlen + pRecvPackage->size() << endl;
}

public: //真正有用的事件
virtual void OnReceiveRSM(const int & APeerARTID, const int & ATransctionID, const int & AFunctionID, TMemoryStreamTool & recvStream, const int & APeerEntityID, const int & ALocalEntityID) override
{ //本事件触发接收一个PIPECom包
//cout << "[MyART]OnReceiveRSM:IP地址" << APeerIP << " -- 端口 " << APeerPort << " 包大小: " << recvStream.size() << endl;
//xxyy++;
//return;
cout << "[MyART]OnReceiveRSM:ARTID=" << APeerARTID << " 实体号:" << APeerEntityID << " 本地实体号:" << ALocalEntityID << " 包大小: " << recvStream.size() << endl;
cout << "接收的字符串为:" << recvStream.readstring() << endl;
//cout << recvStream.traceInfo.getInfoStr() << endl;
} //当接收到数据时
virtual void OnReceiveRPC(const int & APeerARTID, const int & ATransctionID, const int & AFunctionID, TMemoryStreamTool & recvStream, EARTOnServiceReturnFlag & retServicedFlag, TMemoryStreamTool & retResult, const int & APeerEntityID, const int & ALocalEntityID) override
{ //本事件触发接收一个PIPECom包
xxyy++;
//return;
cout << "[MyART]OnReceiveRPC:ARTID=" << APeerARTID << " 实体号:" << APeerEntityID << " 本地实体号:" << ALocalEntityID << " 包大小: " << recvStream.size() << endl;
retServicedFlag = sv_Success;
retResult.writestring("[RPC Reply]新年好!");
//cout << recvStream.traceInfo.getInfoStr() << endl;

retServicedFlag = sv_Success;

//char xx;
//cin >> xx;
//if (LocalARTID() == 2)
//{
// TPIPECom::msg("[RPC回调开始]IP地址" + APeerIP + " -- 端口 " + TARTTools::toStr(APeerPort), "包大小!" + TARTTools::toStr(recvStream.size()));
// RPC(APeerIP, APeerPort, ATransctionID, 55, retResult, retResult, 7, 9);
// TPIPECom::msg("[RPC回调结束]IP地址" + APeerIP + " -- 端口 " + TARTTools::toStr(APeerPort), "包大小!" + TARTTools::toStr(recvStream.size()));
// cout << "回调完成!" << endl;
//}
//else
//TPIPECom::msg("[RPC执行,不回调]" + jw::IntToStr(APeerARTID), "包大小!" + TARTTools::toStr(recvStream.size()));

} //当接收到数据时
virtual void OnReceiveEVENT(const int & APeerARTID, const int & ATransctionID, const int & AFunctionID, TMemoryStreamTool & recvStream, EARTOnServiceReturnFlag & retServicedFlag, TMemoryStreamTool & retResult, const int & APeerEntityID, const int & ALocalEntityID) override
{
cout << "[MyART]OnReceiveEVENT:ARTID=" << APeerARTID << " 实体号:" << APeerEntityID << " 本地实体号:" << ALocalEntityID << " 包大小: " << recvStream.size() << endl;
TPIPECom::msg("[EVENT]ARTID=" + jw::IntToStr(APeerARTID), "包大小!" + TARTTools::toStr(recvStream.size()));
}

public:
virtual void OnReceiveFILEBegin(const int & APeerARTID, const string & ASuggestFileName, const bool & flagExistOverride, const long long & AFileSize, const string & AAttachInfo, bool & retPermitTransFlag, string & retLocalRealName) override
{
cout << "[TARTStar::OnReceiveFILEBegin]收到传输文件请求(下面允许接收):ARTID" << APeerARTID << " 文件名: " << ASuggestFileName << " 文件大小:" << AFileSize << endl;
retPermitTransFlag = true;
}
//默认不接收文件传输。即retPermitTransFlag == false。需要用户接管该事件,然后设置retPermitTransFlag == true,才能开始后续的文件传输工作。
virtual void OnReceivingFILEProcess(const int & APeerARTID, const string & AFileName, const string & AAttachInfo, const long long & AFileSize, const long long & ACurReceivedSize, bool & retInteruptFlag) override
{
//cout << "OnReceiveFILEProcess():" << ACurReceivedSize << " / " << AFileSize << endl;
}
virtual void OnReceiveFILEEnd(const int & APeerARTID, const string & AFileName, const long long & AFileSize, const string & AAttachInfo) override
{
cout << "[TARTStar::OnReceiveFILEEnd]文件传输成功:ARTID=" << APeerARTID << " 文件名: " << AFileName << " 文件大小:" << AFileSize << endl;
}
virtual void OnReceiveFILERollback(const int & APeerARTID, const string & AFileName, const long long & AFileSize, const string & AAttachInfo, const EFileRollBackReason ARollbackReason) override
{
cout << "[TARTStar::OnReceiveFILERollback]文件传输取消:ARTID=" << APeerARTID << " 文件名: " << AFileName << " 文件大小:" << AFileSize << endl;
}
virtual void OnSendingFILEProcess(const int & APeerARTID, const string & ALocalFileName, const string & ASuggestPeerFileName, const string & AAttachInfo, const long long & AFileSize, const long long & ACurSendSize, bool & retInteruptFlag) override
{
//if ((ACurSendSize / (double)AFileSize) * 10)
//cout << "OnSendFILEProcess():" << ACurSendSize << " / " << AFileSize << endl;
}

};


class TTestShareObject : public TShareClass //基于类的共享。
{
public:
int x;
double y;
string z;
public: //注意:下面两个方法内部,请不要增加锁定,锁定过程将由外界使用者自行约定。
virtual void ExportToStream(TStream & retStream) override
{
retStream << x << y << z;
}

virtual bool ImportFromStream(TStream & AStream) override
{
AStream >> x >> y >> z;
return true;
}

void DispInfo()
{
cout << "x = " << x << " y = " << y << " z = " << z << endl;
}
};

int xy = 0;

TShareInt glb_ShareInt;


void Demo_ARTClient()
{

cout << " ======================================================" << endl;
cout << " ARTStar C++ V3.70 分布式ART端" << endl;
cout << endl;
cout << "操作:执行过程中,可以输入数字代表发送普通包和Echo包" << endl;
cout << " 1--RSM_NoWait;2--RPC包, 3 -- QueryTable, 4-读写内存, " << endl;
cout << " 5-P2PConnect, 6--P2PDisconnect, 7--RegistStar" << endl;
cout << " 8--UnRegist, 0--显示统计信息, 13--发送文件" << endl;
cout << " 15-状态注册,16,17-演示变量自动同步功能" << endl;
cout << " 20-查询某ART的共享变量信息" << endl;
cout << " 100以上整数(按回车),则退出程序。" << endl;
cout << "本服务程序需要连接2910TCP端口,若有防火墙拦截,请设置允许!" << endl;
cout << " ======================================================" << endl;
art::TNetTools::Demo_DispLocalNetWorkInfo();
cout << "需要输入:(0)本地IP地址;(1)服务器的IP地址;(2)服务器的端口。" << endl;
cout << endl;

TMyARTStar mm(eaem_StarParallel);
cout << "Mode = " << mm.getExeServiceMode() << endl;
//TTraceCall::ct_TraceFileName = "TraceStar.log";
//mm.EnableComStat(true); //打开统计功能

if (false)
{
cout << mm.fileShare.LocalDirectoryExists("D:") << endl;
cout << mm.fileShare.LocalDirectoryExists("D:\\zzzz") << endl;
cout << mm.fileShare.LocalDirectoryExists("E:\\JWART\\ART\\ARTSourceCode\\JSDPVCL") << endl;
//cout << mm.fileShare.LocalFileDelete("D:\\exp\\zzzz\\54Access.txt_FIFS_CCDEval.txt") << endl;
//cout << mm.fileShare.LocalDirectoryDelete("D:\\exp\\zzzz\\") << endl;
//cout << mm.fileShare.LocalFileRename("D:\\exp\\zzz\\z.txt", "haha.doc") << endl;;
cout << mm.fileShare.LocalDirectoryRename("D:\\exp\\zzz\\", "yyy") << endl;

vector<string> mList;
vector<bool> mIsDirFlagList;
bool mmmzzzz = mm.fileShare.LocalFolderSubDirAndFileList("D:\\exp\\", mList, mIsDirFlagList);
for (int k = 0; k < mList.size(); k ++)
{
cout << k << "\t" << mIsDirFlagList[k] << "\t" << mList[k] << endl;
}
cout << "共包括:" << mList.size() << " 项!" << endl;

return;
}
//#define LOCAL_COMPUTER
#undef LOCAL_COMPUTER

//#define NORMAL_EXE
#ifdef NORMAL_EXE
cout << "是否打开文件(1打开!):";
cin >> xxyy;
if (xxyy == 1)
desFile = fopen("D:\\aabb.rar", "wb");
#endif

string mLocalBoundIP = "127.0.0.1";
//mLocalBoundIP = "192.168.1.99";
//#ifndef LOCAL_COMPUTER
cout << "(0)请输入本地IP地址(数字1代表本地127.0.0.1):";
mLocalBoundIP = "";
while (mLocalBoundIP == "") cin >> mLocalBoundIP;
if (mLocalBoundIP.length() < 5) mLocalBoundIP = "127.0.0.1";
//#endif
mm.Open(mLocalBoundIP, 0); //任意绑定!
//mm.Open("192.168.1.99", 0, true); //任意绑定!
cout << "本地IP地址:" << mm.LocalIP() << "\t端口:" << mm.LocalPort() << endl;

//string mIP = "127.0.0.1";
string mIP = mLocalBoundIP;
int mPort = 2910;
#ifndef LOCAL_COMPUTER
cout << "请输入:(1)服务器的IP地址:";
//while (mIP == "") getline(cin, mIP);
cin >> mIP;
if (mIP.length() < 5) mIP = "127.0.0.1";
//#endif
//if (mIP == "") { mIP = "127.0.0.1"; cout << "ps:您没有输入,按照127.0.0.1设置" << endl;} //如果用户直接按下回车,则发送给本机器。
cout << "请输入:(2)服务器的端口号(如2910,输入单个数字也意味着2910):";
cin >> mPort;
if (mPort < 10) mPort = 2910;
#endif

#ifndef LOCAL_COMPUTER
//cout << "执行方案(0--IBM, 1--SYS):";
//int mMethod = 0;
//cin >> mMethod;
//string mLocalBoundIP = "192.168.1.2";
//if (mMethod == 0) mLocalBoundIP = "192.168.1.99";

//mm.Open(mLocalBoundIP, 4612); //任意绑定!
//cout << "本地IP地址:" << mm.LocalIP() << "\t端口:" << mm.LocalPort() << endl;
//
//string mIP = "192.168.1.99";
//if (mMethod == 0) mIP = "192.168.1.2";
//unsigned short int mPort = 4612;

#endif

mm.memShare.RegistObject("starsharevar", glb_ShareInt);
//glb_ShareInt.BeginWrite();
glb_ShareInt.data = 7654; //因为整数数据很短,所以不用加锁,否则需要锁定。
//glb_ShareInt.EndWrite();

TARTPackage rp; //接收包
TARTPackage sp; //发送数据包;
//sp.writeint(0);
//sp.writeint(0);
sp << "你好啊,我是一只小小鸟!";
cout << "数据长度:" << sp.size() << " 总长度:" << sp.headlen + sp.size() << endl;
int mFlag = 1;
while ((mFlag >= 0) && (mFlag <= 100))
{
cout << "继续发送数据包(输入1或2发送,其它数字退出):";
cin >> mFlag;
//for (int k = 0; k < 100; k ++) //进行循环,压力测试。
if (mFlag == 0)
{
cout << "=============================================================" << endl;
cout << "本地ARTID:" << mm.LocalARTID() << " IP地址:" << mm.LocalIP() << " : " << mm.LocalPort() << endl;
cout << "发送包/数据量:" << mm.getComStat().send.PackageCount << " / " << mm.getComStat().send.WholeSize << endl;
cout << "接收包/数据量:" << mm.getComStat().recv.PackageCount << " / " << mm.getComStat().recv.WholeSize << endl;
cout << "当前内存申请包数量:" << TPIPEComPackagePool::GetAllocateTotalCount() << endl;
//cout << "客户信息情况如下:" << endl;
cout << "----------------- PIPECom ClientTable------------------------------" << endl;
mm.PIPEComClientInfoTable().DispClientInfoTable();
cout << "----------------- ARTBase ClientTable------------------------------" << endl;
mm.ARTBaseClientInfoTable().DispClientInfoTable();
cout << "----------------- ARTCustom ClientTable ---------------------------" << endl;
cout << mm.ARTClientTable().DispClientTable() << endl;;
cout << "------------------ 本地内存共享情况 --------------------------" << endl;
cout << mm.memShare.SearchShareMemBasicList() << endl;
//准备导出本地共享文件目录。
vector<string> mRootList, mRealPathList;
mm.ExportLocalVirtualRootPathToList(mRootList, mRealPathList);
if (mRootList.size() > 0)
{
cout << "------------------ 本地共享文件目录 --------------------------" << endl;
for ( int k = 0; k < mRootList.size(); k ++)
{
cout << k << "\t" << mRootList[k] << "\t-->\t" << mRealPathList[k] << endl;
}
}
cout << "-------------------------------------------------------------------" << endl;
cout << "本地ARTID = " << mm.LocalARTID() << " 本地IP地址:" << mm.LocalIP() << " : " << mm.LocalPort() << endl;
}
if (mFlag == 1)
{
cout << "请输入ART客户端ARTID(0--群发):";
int mARTID;
cin >> mARTID;
//if (mARTID != 0)
{
TMemoryStream mss;
mss.writestring("[RSM]新春快乐!2012---win!!!");
//TARTCustom::EnableTrace(false, "abc.txt");
bool mResultFlag = mm.RSM(mARTID, 0, 2, sp, 7, 8);
cout << "RSM发送结果:" << mResultFlag << endl;
}
}
if (mFlag == 2)
{
cout << "请输入RPC的ART客户端ARTID:";
int mARTID;
cin >> mARTID;
//if (mARTID != 0)
{
TMemoryStream mss;
//mss.traceInfo.AddInfo("TMyStar::开始执行RPC,哈哈,测试跟踪效果!");
mss.writestring("[RPC]新春快乐!2012---win!!!");
EARTRPCResult mResultFlag = mm.RPC(mARTID, 0, 1, mss, mss, 6, 9);
cout << "RPC发送结果:" << TARTBaseInterpret::InterpretRPCResult(mResultFlag) << endl;
cout << "RPC结果包大小:" << mss.size() << endl;
//mss.clear(); //该语句用于测试跟踪效果!
if (mResultFlag == rpc_Success) cout << mss.readstring() << endl;
}
}
if (mFlag == 3)
{
cout << "本地共享变量值:" << glb_ShareInt.data << endl;
//cout << "查询ART客户表:" << mm.QueryARTTable(mm.ARTClientTable()) << endl;
//cout << mm.ARTClientTable().DispClientTable() << endl;
}
//if (mFlag == 2) {EARTRSMResult mResultFlag = mm.RSM_WaitFinishService(mIP, mPort, sp); cout << "MSG发送结果:" << mResultFlag << endl; }
//if (mFlag == 3) cout << mm.UDPSendPackage(mIP, mPort, sp) << endl;
if (mFlag == 4)
{
if (true)
{
cout << "输入要读取的ARTID:";
int mPeerARTID;
cin >> mPeerARTID;
TShareInt zz;
EMemResult mFlag = mm.memShare.ShareRead(mPeerARTID, "starsharevar", zz);
cout << "内存读操作结果 = " << mFlag << endl;
if (mFlag == mem_Success) cout << "读取成功:" << zz.data << endl;
zz.data += 2;
cout << "再次写入,增加2 = " << mFlag << endl;
mm.memShare.ShareWrite(mPeerARTID, "starsharevar", zz);

cout << "再次读取结果 = ";
TShareInt tempInt;
tempInt.Bind(mm, jw::IntToStr(mPeerARTID) + ":\\starsharevar");
tempInt.data = 4455;
tempInt.ShareRead();
cout << tempInt.data << endl;

}
if (false)
{
TShareVar zz(sizeof(int));
//EMemShareOprResult mFlag = mm.memShare.ShareRead(mIP, 2910, "sharevar", zz);
//cout << "内存读操作结果 = " << mFlag << endl;
//if (mFlag == mem_Success) cout << "读取成功:" << zz.asInt() << endl;
//zz.asInt() ++;
//mm.memShare.ShareWrite(mIP, 2910, "sharevar", zz);
}
if (false)
{
TTestShareObject mso;
//EMemShareOprResult mFlag = mm.memShare.ShareRead(mIP, 2910, "mso", mso);
//cout << "内存读操作结果 = " << mFlag << endl;
//if (mFlag == mem_Success) cout << "读取成功:" << mso.x << "\t" << mso.y << "\t" << mso.z << endl;
//mso.DispInfo();
//mso.x ++;
//mso.y = mso.y + 100;
//mso.z = mso.z + "*" + jw::IntToStr(mso.x);
//mm.memShare.ShareWrite(mIP, 2910, "mso", mso);
}
if (false)
{
TShareString shareString;
//EMemShareOprResult mFlag = mm.memShare.ShareRead(mIP, 2910, "jiangwei", shareString);
//cout << "内存读操作结果 = " << mFlag << endl;
//if (mFlag == mem_Success) cout << shareString.data << endl;
//shareString.data += "*" + jw::IntToStr(rand());
//mFlag = mm.memShare.ShareWrite(mIP, 2910, "jiangwei", shareString);
//cout << "内存写操作结果 = " << mFlag << endl;
}

if (true)
{
TShareString shareString;
shareString.Bind(mm, "sharestring"); //没有指明位置,默认为全局变量。
EMEMResult mFlag = shareString.ShareRead();
cout << "全局变量,读操作结果 = " << mFlag << endl;
if (mFlag == mem_Success) cout << shareString.data << endl;
shareString.data += "*" + jw::IntToStr(rand());
mFlag = shareString.ShareWrite();
cout << "全局变量,写操作结果 = " << mFlag << endl;
}
if (false)
{
//TFileStream mDes("D:\\xxyyxx.rar", fmOpenWrite);
//TMemoryStream mDes;
//TShareStreamTool mfs(mDes);
//cout << "内存读取结果:" << mm.memShare.ShareRead(mIP, 2910, "mfs", mfs) << endl;
}
}
if (mFlag == 5)
{
string svrIP = mIP;
//cout << "请输入将要连接的服务器的IP地址:";
//while (svrIP == "") getline(cin, svrIP);
//cout << "请输入将要连接的服务器的端口号:";
unsigned short svrPort = mPort;
//cin >> svrPort;
//EPIPEComP2PConnectResultType mResultFlag = mm.Connect(svrIP, svrPort, 10000);
EARTStarConnectResultType mResultFlag = mm.ConnectCenter(svrIP, svrPort, 10000);
cout << "CenterConnect结果:" << mResultFlag << endl;
}
if (mFlag == 6)
{
string svrIP = mIP;
//cout << "请输入将要连接的服务器的IP地址:";
//while (svrIP == "") getline(cin, svrIP);
cout << "请输入将要连接的服务器的端口号:";
unsigned short svrPort = mPort;
cin >> svrPort;
EPIPEComP2PDisconnectResultType mFlag = mm.Disconnect(svrIP, svrPort);
cout << "P2PDisconnect结果:" << mFlag << endl;
}
if (mFlag == 7)
{
if (mm.is_ConnectCenter() == true)
{
int artid;
cout << "请输入本地的ARTID(0,为需要分配的ID):";
cin >> artid;
vector<int> roleList;
roleList.push_back(34);
roleList.push_back(56);
cout << "ARTLogin返回结果标记:" << mm.Login(artid, "ART", roleList) << endl;
cout << "本地ARTID为" << mm.LocalARTID() << endl;

//现在测试全局共享内存的写入情况。

mm.memShare.RegistGlobalObject("zz");
{
TShareString sszz, ttgg;
sszz.data = "大河向西流啊!";
EMemResult mFlag = mm.memShare.ShareWrite(1, "ppp", sszz);
cout << "内存写入结果标记:" << mFlag << endl;
mFlag = mm.memShare.ShareRead(1, "ppp", ttgg);
cout << "内存读取结果标记:" << mFlag << endl;
cout << "读取的数据为:" << ttgg.data << endl;
}
mm.EnableShareMem_GlobalAutoAppend = true;
{
TShareString sszz, ttgg;
sszz.data = "----东边日出西边雨!------";
EMemResult mFlag = mm.memShare.ShareWrite(2, "ppp", sszz);
cout << "内存写入结果标记:" << mFlag << endl;
mFlag = mm.memShare.ShareRead(2, "ppp", ttgg);
cout << "内存读取结果标记:" << mFlag << endl;
cout << "读取的数据为:" << ttgg.data << endl;
}
}
else cout << "[Error]请首先连接到Center!" << endl;
}
if (mFlag == 8)
{
if (mm.is_ConnectCenter() == true)
{
mm.Logout();
cout << "本地ARTID为" << mm.LocalARTID() << endl;
}
else cout << "[Error]请首先连接到Center!" << endl;

}
if (mFlag == 77)
{
cout << " xxyy == " << xxyy << endl;
DisplayTotal();
continue;
}
if (mFlag == 9)
{
vector<int> zzz;
zzz.push_back(55);
zzz.push_back(33);
zzz.push_back(44);

int mResultFlag = mm.serviceConcept.RegistReceiveEvent(true, zzz);

cout << "RegistReceiveEvent发送结果:" << mResultFlag << endl;
continue;
}
if (mFlag == 10)
{
TMemoryStream mss;
mss.writestring("[RSM]新春快乐!2012---win!!!");
cout << "[RSM]请输入对方ARTID:";
int martid;
cin >> martid;

//TARTCustom::EnableTrace(false, "abc.txt");
int mResultFlag = false;
TTimer zzz;
zzz.BeginTimer();
//for (int k = 0; k < 100000; k ++)
{
mResultFlag = mm.EVENTToART(martid, 0, 55, sp, rp);
cout << "长度:" << sp.size() << endl;
//mResultFlag = mm.EVENT(0, 55, sp, true);
}
zzz.EndTimer();
zzz.DispInDOS();

cout << "NotifyEvent发送结果:" << mResultFlag << endl;
continue;
}
if (mFlag == 11)
{
TMemoryStream mss;
mss.writestring("[RSM]新春快乐!2012---win!!!");
cout << "[RSM]请输入对方ARTID:";
int martid;
cin >> martid;

//TARTCustom::EnableTrace(false, "abc.txt");
int mResultFlag = 0;
TTimer zzz;
zzz.BeginTimer();
//for (int k = 0; k < 100000; k ++)
{
//mResultFlag = mm.NotifyEVENT(martid, 0, 55, sp, rp);
mResultFlag = mm.EVENTToAllART(0, 55, sp, true);
}
zzz.EndTimer();
zzz.DispInDOS();

cout << "NotifyEvent发送结果:" << mResultFlag << endl;
continue;
}
if (mFlag == 12)
{
cout << "准备注册根" << endl;
cout << mm.fileShare.PublishVirtualSharePath("D:\\exp", "\\") << endl;
cout << mm.fileShare.PublishVirtualSharePath("D:\\exp\\yyy", "\\jw") << endl;
continue;
}
if (mFlag == 13)
{
cout << "准备删除注册根" << endl;
cout << mm.fileShare.RemoveVirtualSharePath("\\jw\\") << endl;
continue;
}
if (mFlag == 14)
{
cout << "列举出全部共享虚拟根:" << endl;
vector<string> mRootList, mLocalPathList;
mm.fileShare.ListAllRoots(mRootList, mLocalPathList);
for (int k = 0; k < mRootList.size(); k ++)
{
cout << k << "\t" << mRootList[k] << " --> " << mLocalPathList[k] << endl;
}

cout << "映射本地结果!" << endl;
string mRealPath, mRootARTID;
cout << mm.fileShare.VirtualPathToRealPath("2:\\zs.txt", mRootARTID, mRealPath) << endl;
cout << mRootARTID << endl;
cout << mRealPath << endl;

cout << mm.fileShare.VirtualPathToRealPath("2:\\jw\\ls.txt", mRootARTID, mRealPath) << endl;
cout << mRootARTID << endl;
cout << mRealPath << endl;

cout << mm.fileShare.VirtualPathToRealPath("2:\\jw\\ls.txt\\", mRootARTID, mRealPath) << endl;
cout << mRootARTID << endl;
cout << mRealPath << endl;

cout << mm.fileShare.VirtualPathToLocalPath_InThisLocalART("-1:\\jw\\ww.doc") << endl;
cout << mm.fileShare.VirtualPathToLocalPath_InThisLocalART("D:\\jw\\ww.doc") << endl;

cout << " hahah " << endl;
cout << mm.fileShare.is_VirtualRootPath("-1:\\jw") << endl;
cout << mm.fileShare.is_GuessPossibleVirtualPath("-1:\\jwzz\\haha") << endl;
cout << mm.fileShare.is_VirtualRootPath("2:\\jw") << endl;
continue;
}
if (mFlag == 15)
{
cout << "准备显示文件列表:" << endl;

cout << mm.fileShare.PathExists("D:\\exp\\") << endl;
//cout << mm.fileShare.PathCreate("2:\\jw\\zs") << endl;
cout << mm.fileShare.FileExists("2:\\jw\\z.txt") << endl;
//cout << mm.fileShare.FileDelete("2:\\jw\\复件 z.txt") << endl;
//cout << mm.fileShare.FileRename("2:\\jw\\z.txt", "y.doc") << endl;
continue;

vector<string> mFileNameList;
vector<bool> mIsDirFlagList;
cout << mm.fileShare.PathShowDirectoryAndFileList("2:\\", mFileNameList, mIsDirFlagList) << endl;
//cout << mm.fileShare.PathShowFileNameList("2:\\jw\\", mFileNameList) << endl;
for (int k = 0; k < mFileNameList.size(); k ++)
{
cout << k << "\t" << mFileNameList[k] << "\t" << mIsDirFlagList[k] << endl;
}
continue;
}
if (mFlag == 16)
{
//mm.fileShare.EnableSameIPIdentify(true);
vector<string> mRootList;
mm.fileShare.ListAllRoots(mRootList);
cout << "根列表!" << endl;
for (int k = 0; k < mRootList.size(); k ++)
{
cout << mRootList[k] << endl;
}
cout << "开始发送文件!" << endl;
//cout << mm.fileShare.FileUpload("D:\\exp\\yyy\\haha.txt", "2:\\jw\\zs\\tt.txt", false) << endl;
//cout << mm.fileShare.FileDownload("2:\\jw\\zs\\tt.txt", "D:\\exp\\yyy\\download.txt", true) << endl;
//cout << mm.fileShare.FileDownload("2:\\jw\\zs\\tt.txt", "D:\\exp\\yyyttt\\download.txt", true) << endl;

//cout << mm.fileShare.FileCopy("2:\\jw\\zs\\tt.txt", "5:\\ggg.txt", true) << endl;
//cout << mm.fileShare.FileCopy("2:\\jw\\zs\\tt.txt", "D:\\exp\\ggg.txt", true) << endl;

//cout << mm.fileShare.FileMove("2:\\jw\\zs\\tt.txt", "5:\\gggmmm.txt", true) << endl;
//cout << mm.fileShare.FileMove("2:\\jw\\zs\\tt.txt", "2:\\gggmmm.txt", true) << endl;
cout << mm.fileShare.FileCopy("2:\\DirFileInfoToFile.exe", "5:\\jw\\", true) << endl;
cout << mm.fileShare.FileCopy("2:\\600M.txt", "5:\\jw\\gggmmm600M.txt", true) << endl;
continue;
}
if (mFlag == 22)
{
TMemoryStream mss;
mss.writestring("[RSM]新春快乐!2012---win!!!");
cout << "[RSM]请输入对方ARTID:";
int martid;
cin >> martid;

//TARTCustom::EnableTrace(false, "abc.txt");
bool mResultFlag = false;
TTimer zzz;
zzz.BeginTimer();
//for (int k = 0; k < 100000; k ++)
{
//sp.reset();
//sp.writeint(k);
//sp.writeint(glb_StreamSendCount);
mResultFlag = mm.RSM(martid, 0, 2, sp);
//mm.RPC(martid, 0, 1, sp, rp);
}
zzz.EndTimer();
zzz.DispInDOS();

cout << "RSM发送结果:" << mResultFlag << endl;
continue;
}
if (mFlag == 33)
{
cout << "[RPC]请输入对方ARTID:";
int martid;
cin >> martid;

TMemoryStream mss;
//mss.traceInfo.AddInfo("TMyStar::开始执行RPC,哈哈,测试跟踪效果!");
mss.writestring("[RPC]新春快乐!2012---win!!!");

EARTRPCResult mResultFlag = rpc_Success;
TTimer zzz;
zzz.BeginTimer();
for (int k = 0; k < 100000; k ++)
{
EARTRPCResult mResultFlag = mm.RPC(martid, 0, 1, mss, mss);
}
zzz.EndTimer();
zzz.DispInDOS();
cout << "RPC发送结果:" << TARTBaseInterpret::InterpretRPCResult(mResultFlag) << endl;
cout << "RPC结果包大小:" << mss.size() << endl;
//mss.clear(); //该语句用于测试跟踪效果!
if (mResultFlag == rpc_Success) cout << mss.readstring() << endl;
continue;
}
if (mFlag == 35)
{
vector<string> zzz;
zzz.push_back("nihao");
zzz.push_back("hello");
zzz.push_back("starsharevar");
mm.serviceConcept.RegistSynShareMem(true, zzz);
continue;

}
if (mFlag == 36)
{
glb_ShareInt.data = glb_ShareInt.data + 5;
glb_ShareInt.SynchronizeBlockUpdate("starsharevar");
}
if (mFlag == 38)
{
int mResultFlag = mm.serviceConcept.RegistServiceReady(true, 2887, "nihao");
cout << "RegistServiceReady发送结果:" << mResultFlag << endl;
map<string, _RSynMemInfo> SynMemList;
_RSynMemInfo mNode;
mNode.IsAuthority = true;
mNode.AuthoryPriory = 3245;
mNode.synType = synmem_ReadWrite;
SynMemList.insert(pair<string, _RSynMemInfo>("starsharevar", mNode));
mNode.IsAuthority = false;
mNode.AuthoryPriory = 8877;
mNode.synType = synmem_Write;
SynMemList.insert(pair<string, _RSynMemInfo>("nis_gg", mNode));

map<string, bool> tempGlobalMap;
mResultFlag = mm.serviceConcept.RegistSynShareMem(true, SynMemList, tempGlobalMap);
cout << "RegistShareMem发送结果:" << mResultFlag << endl;
//mResultFlag = mm.serviceConcept.ModifyUserState(45, "一般般吧!");
//cout << "Regist发送结果:" << mResultFlag << endl;

mResultFlag = mm.serviceConcept.ModifyUserState(2887, "一般般吧!");
cout << "ModifyUserState发送结果:" << mResultFlag << endl;
}
if (mFlag == 16)
{
//glb_ShareInt.data = 54321;
//int mResultFlag = glb_ShareInt.SynchronizeBlockUpdate();
//cout << "同步更新结果:" << mResultFlag << endl;
}
if (mFlag == 17)
{
//glb_ShareInt.BeginRead();
cout << "当前的 starsharevar 中的值是:" << glb_ShareInt.data << endl;
//glb_ShareInt.EndRead();
}
if (mFlag == 20)
{
vector<int> mARTIDList;
vector<string> mIPList;
vector<int> mPortList;
mm.ARTClientTable().SearchTable(mARTIDList, mIPList, mPortList);
if (mARTIDList.size() == 0)
{
cout << "[Warning]当前用户表不存在用户!您可能尚未注册!" << endl;
}
else
{
cout << "总用户数:" << mARTIDList.size() << endl;
for (int k = 0; k < mARTIDList.size(); k ++)
{
string mInfo;
EGenerationResultType mResultFlag = mm.memShare.QueryShareMemBasicList(mARTIDList[k], mInfo);
if (mResultFlag == egrt_Success)
cout << "ARTID = " << mARTIDList[k] << " 变量共享情况 = " << mInfo << endl;
else
cout << "查询失败,返回的标识!" << mResultFlag << endl;
}
//TTimer jwtimer;
//long long mCount = 0;
//jwtimer.BeginTimer();
for (int k = 0; k < mARTIDList.size(); k ++)
{
if (mARTIDList[k] == mm.LocalARTID()) continue;
//mCount ++;
//string mInfo;
//for (int xxx = 0; xxx < 10000; xxx ++) //进行压力测试。看看速度
//EGenerationResultType mResultFlag = mm.memShare.QueryShareMemBasicList(mARTIDList[k], mInfo);
//if (mResultFlag == egrt_Success)
// cout << "ARTID = " << mARTIDList[k] << " 变量共享情况 = " << mInfo << endl;
//else
// cout << "查询失败,返回的标识!" << mResultFlag << endl;
}
//jwtimer.EndTimer();
//jwtimer.dispdos();
//cout << mCount << endl;
}
}
if (mFlag == 21)
{
int mARTID = 2; //暂约定STK的为2。
TShareInt mInt;
TShareString mStr;
mInt.Bind(mm, "testint");
mStr.Bind(mm, "testansistring");

mInt.data = 0;

cout << mInt.getPublishLocalShareName() << endl;
int mResultFlag = mInt.ShareRead();
//int mResultFlag = mInt.ShareRead(mARTID);
cout << "MEM从ARTID=2的读取结果:" << mResultFlag << endl;
cout << "当前testint = " << mInt.data << endl;
mResultFlag = mStr.ShareRead();
cout << "当前testansistring:" << mStr.data << endl;
//下面修改对方的值。
if (mResultFlag == 0) //代表内存操作正确
{
mInt.data ++;
mInt.ShareWrite();

//调用RPC进行问候
TMemoryStream zz;
zz.writestring("Hi, 兄弟,我是:" + jw::IntToStr(mm.LocalARTID()));
mResultFlag = mm.RPC(mARTID, 0, 2013, zz, zz);
if (mResultFlag == 0)
{
if (zz.size() > 0) cout << "够意思,回复我说:" << zz.readstring() << endl;
else cout << "够意思,回复了,但是啥也没说!" << endl;
}
else cout << "对方没反应,错误码:" << mResultFlag << endl;
}

}
if (mFlag == 22)
{
//调用RPC执行STK命令
TMemoryStream zz;
zz.writestring("nothing");
int mResultFlag = mm.RPC(2, 0, 2014, zz, zz);
if (mResultFlag == 0)
{
if (zz.size() > 0)
{
const bool mIsConnectSTK = zz.readbool();
if (mIsConnectSTK) cout << "对方回复,已经连接到STK!" << endl;
else cout << "对方回复,没有连接STK! No..." << endl;
}
else cout << "对方回复了,但是啥也没说!" << endl;
}
else cout << "对方没反应,错误码:" << mResultFlag << endl;
}
if (mFlag == 23)
{
//GetSTKVersion /
//Animate Scenario/* Start
//Animate Scenario/* Pause
//Animate Scenario/* Reset
//GetAnimTime *
//GetEpoch *
//CheckScenario /
//GetScenPath *
//GetTimePeriod */
//AllInstanceNames /

//调用RPC执行STK命令
string mSTKCommand = "GetSTKVersion /";
TMemoryStream zz;
zz.writestring(mSTKCommand);

cout << "准备执行STK命令:" << mSTKCommand << endl;
int mResultFlag = mm.RPC(2, 0, 2012, zz, zz);
if (mResultFlag == 0)
{
const int mTag = zz.readint32();
if (mTag == 0) cout << "执行成功!没有结果数据!" << endl;
else if (mTag == 1) cout << zz.readstring() << endl;
else cout << "对方回复标记:" << mTag << endl;
}
else cout << "对方没反应,错误码:" << mResultFlag << endl;
}
if (mFlag == 27)
{
//调用RPC进行问候
TMemoryStream zz;
zz.writestring("Hi, 兄弟,我是:" + jw::IntToStr(mm.LocalARTID()));
cout << "发出的流长度:" << zz.size() << endl;
zz.reset();
string xx = zz.readstring();
cout << "xx =" << xx << endl;
int mResultFlag = mm.RPC(2, 0, 2013, zz, zz);
if (mResultFlag == 0)
{
if (zz.size() > 0) cout << "够意思,回复我说话了!" << zz.readstring() << endl;
else cout << "够意思,回复了,但是啥也没说!" << endl;
}
else cout << "对方没反应,错误码:" << mResultFlag << endl;
}
if (mFlag == 66)
{
TMemoryStream mss;
//mss.writestring("[RSM]新春快乐!2012---win!!!");
//TARTCustom::EnableTrace(false, "abc.txt");
TTimer jwtimer;
cout << "进行RSM 10万次操作时间统计!" << endl;
jwtimer.BeginTimer();
int mResultFlag = -1;
for (int k = 0; k < 100000; k ++)
{
//mResultFlag = mm.RSM(mIP, mPort, 0, 2, sp);
}
jwtimer.EndTimer();
jwtimer.DispInDOS();
cout << "RSM发送结果:" << mResultFlag << endl;

cout << "进行RPC 10万次操作时间统计!" << endl;
jwtimer.BeginTimer();
for (int k = 0; k < 100000; k ++)
{
//mResultFlag = mm.RPC(mIP, mPort, 0, 2, sp, sp);
}
jwtimer.EndTimer();
jwtimer.DispInDOS();
cout << "RPC发送结果:" << mResultFlag << endl;

cout << "进行MEM 10万次操作时间统计!" << endl;
jwtimer.BeginTimer();
for (int k = 0; k < 100000; k ++)
{
//mResultFlag = mm.RSM(mIP, mPort, 0, 2, sp);
//mResultFlag = glb_ShareInt.ShareRead(mIP, mPort);
}
jwtimer.EndTimer();
jwtimer.DispInDOS();
cout << "MEM发送结果:" << mResultFlag << endl;
}
if (mFlag == 9)
{
TPIPEComPackage sp;
static int ttcctt = 0;
sp.writestring("你好啊,我的序号是:" + TARTTools::toStr(++ttcctt) + " 认识一下吧:)");
//cout << "P2P发送结果:" << mm.PIPECom.P2PSendPackage(mIP, mPort, sp) << endl;
{
vector<string> mList;
string mLine;
FILE * fp;
//fp = fopen("D:\\jd\\neg.seg.txt", "rb");
//fp = fopen("D:\\AISAOCRL20061111毕业论文版.rar", "rb");
if (false)
{
TFileStream fss("E:\\QGFX.rar", fmOpenRead);
TTimer jwtimer;
jwtimer.BeginTimer();
//mm.PIPECom.P2PSendStream(mIP, mPort, fss);
//mm.PIPECom.PIPESendStream(mIP, mPort, 2, fss);
cout << "文件发送完毕!" << endl;
jwtimer.EndTimer();
jwtimer.DispInDOS();
}
else
{
cout << "P2P发送数据!...." << endl;
fp = fopen("E:\\QGFX.rar", "rb");
TTimer jwtimer;
jwtimer.BeginTimer();
int mIndex = 0;
const int bufferlen = 8000;
char buf[bufferlen];
int mReadCount = 1;
int mSendCount = 0;
int cishuTotal = 0;
while (mReadCount > 0)
{
++ cishuTotal;
mReadCount = fread(buf, sizeof(char), bufferlen, fp);
if (mReadCount <= 0) break;
sp.clear();
sp.WriteBuffer(buf, mReadCount);
++mSendCount;
//cout << "sendcount = " << mSendCount << endl;
if (mSendCount % 100 == 0) cout << ".";

mm.P2PSendPackage(mIP, mPort, sp);
if (mReadCount < bufferlen) break;
}
cout << "文件发送完毕!" << endl;
jwtimer.EndTimer();
fclose(fp);
jwtimer.DispInDOS();
}
//char ppzz;
//cin >> ppzz;
}
}
if (mFlag == 11) //开始发送文件
{
//EARTFILEResultType mResultFlag = mm.SendFile(mIP, 2910, "D:\\abc.txt", "d:\\zzpp.txt", "");
//28个字节文件传输测试。(会自动放在一个包中发送)
//cout << "文件传输结果类型:" << mResultFlag << endl;
}
if (mFlag == 12) //开始大文件发送
{
//EARTFILEResultType mResultFlag = mm.SendFile(mIP, 2910, "D:\\aa.rar", "d:\\xxyyxxa.rar", "");
//1.95M文件发送测试。(会分开多个包发送)
//cout << "文件传输结果类型:" << mResultFlag << endl;
}
if (mFlag == 13) //给Star开始大文件发送
{
cout << "输入要发送文件ARTID端(注意:需要双方登录):";
int starid;
cin >> starid;

TTimer jwtimer;
jwtimer.BeginTimer();
//for (int k = 0; k < 20; k ++)
{
EARTFILEResultType mResultFlag = mm.SendFile(starid, "D:\\testaa.rar", "d:\\xxyyxxa.rar", "");
//EARTFILEResultType mResultFlag = mm.SendFile(starid, "D:\\aa.rar", "d:\\xxyyxxa.rar", "");
//EARTFILEResultType mResultFlag = mm.SendFile(starid, "E:\\QGFX.rar", "d:\\xxyyxxa.rar", "");
//40M文件测试。(进行大规模压力测试、和测试自动连接Star的技术)
//EARTFILEResultType mResultFlag = mm.SendFile(starid, "E:\\ISO\\office_2007\\office2007.iso", "D:\\xxx.iso");
cout << "文件传输结果类型:" << mResultFlag << endl;
//cout << "xx= " << xx << "yy = " << yy << endl;
}
jwtimer.EndTimer();
jwtimer.DispInDOS();
}
if (mFlag == 55)
{
cout << "通信统计信息如下!" << endl;
cout << mm.getComStat().DispStatInfo() << endl;
//cout << "xx= " << xx << "yy = " << yy << endl;
}
}
if (xxyy == 1)
fclose(desFile);
mm.Close();
cout << "总字节:" << recvFileSize << endl;
cout << "现在内存包申请数量:" << TPIPEComPackagePool::GetAllocateTotalCount() << endl;

}


void E013_Demo()
{
Demo_ARTClient();
}

}; //end namespace __Test_ARTStar__

输出

(一)ARTStar端One运行图

.

(二)ARTStar端Two运行图

(三)ARTStar端Three运行图

(四)ARTCenter的运行图

(五)说明:

(1)ARTStar必须与ARTCenter配合运行,先启动ARTCenter提供服务,然后各个ARTStar连接在ARTCenter上,之后ARTStar会自动实现他们之间的自由连接。

(2)ARTStar提供了P2P数据传输、File文件传输、RPC远程过程调用、RSM远程消息、EVENT事件触发、ServiceConcept服务概念、MemoryShare内存共享、FileSystem文件系统。能够满足大多数分布式网络编程的需求。ARTStar和ARTCenter配合提供了分布式网络程序设计框架。基于这两个类TARTStar和TARTCenter,重载后进行各个事件的响应,从而易于分布式网络程序设计和实现。

(3)orsci-RTI软件产品就是基于ARTStar和ARTCenter实现的分布式仿真框架。

(4)ART的设计和工作原理,请参看书籍:姜维. 《分布式网络系统与Multi-Agent系统编程框架》

(5)在orsci-art包中,使用TPIPECom类作为基础类,派生后进行自定义的管道通信编程。

(6)orsci包支持PIPE网络编程,提供TPIPECom基础类,可下载配套软件orsci-art应用。

书籍 姜维. 《分布式网络系统与Multi-Agent系统编程框架》
软件 orsci-art开发包(C++语言)。