SRP分布式对象平台是一个用于开发分布式应用的中间件和平台,提供了强大灵活的通信方式。在高层,开发者不需要了解Socket相关的各种函数和流程;在底层,开发者可以通过开发相应的接口模块,自行定义通信的方式,包括使用TCP,UDP,或者其它任何特殊的传输方式。SRP平台通信结构如下图所示:
---------------------------------
|
高层应用
|
--------------------------------
|
---------------------------------
|
SRP平台
|
---------------------------------
|-------------------------------------------------|
---------------------------------
---------------------------------
| 默认TCP通信接口
| | 自定义通信接口
|
---------------------------------
---------------------------------
在客户端,自定义通信接口如果不存在,将由SRP平台自动下载,详细开发自定义接口的例程和接口手册可参考网站
http://www.srplab.com相关文档。本文重点关注高层应用如何开发通信。
SRP分布式对象平台提供了完善的通信方式,使用Socket通信是最基本的通信方式,其它方式,包括类似Cobra等基于对象的通信方式,将在后继文档中描述。
目前使用SRP平台开发应用程序,可以使用C/C++语言和Lua脚本语言。
一:使用C/C++语言开发
1.服务器端
a.初始化SRP平台,获取接口
装载动态链接库
hDllInstance = ::LoadLibrary( "srpsdll.dll" );
if( hDllInstance == NULL )
return false;
获取动态库中的接口函数
1.平台初始化函数
VSInitProc = (VSServer_InitProc)GetProcAddress( hDllInstance, VSSERVER_INIT_NAME );
2.平台结束函数
VSTermProc = (VSServer_TermProc)GetProcAddress( hDllInstance, VSSERVER_TERM_NAME );
3.平台基本接口,包括一些基本的函数,参见接口手册
QueryBasicInterfaceProc = (VSServer_QueryBasicInterfaceProc)GetProcAddress( hDllInstance, VSSERVER_QUERYBASICINTERFACE_NAME );
4.控制接口,控制接口主要处理SRP平台的消息循环
QueryControlInterfaceProc = (VSServer_QueryControlInterfaceProc)GetProcAddress( hDllInstance, VSSERVER_QUERYCONTROLINTERFACE_NAME );
初始化平台
VSInitProc( false, true, "", 0, "", 0);
获取SRP平台接口和控制接口
BasicSRPInterface = QueryBasicInterfaceProc();
SRPControlInterface = QueryControlInterfaceProc();
b.侦听服务器端口
BasicSRPInterface -> SetupSocketServer( "", 3030, &LinkInterfaceStatus, VS_SockAcceptCallBack,0);
VS_SockAcceptCallBack为处理侦听的回调函数,当有客户端建立连接时,该回调函数被调用。
void VS_SockAcceptCallBack( DWORD uMes, DWORD ConnectionID, SOCKADDR_IN SockAddr, DWORD Para, DWORD MachineID, VS_SockEventCallBackProc *ClientCallBack, DWORD *ClientPara )
{
if( uMes == VS_SOCKET_ONACCEPT ){
(*ClientCallBack) = VS_SockEventCallBack;
}
return ;
}
回调函数返回处理该客户连接和消息收发的函数
c.处理客户连接和消息收发
void VS_SockEventCallBack( void *Machine, DWORD uMsg, DWORD MachineID, DWORD LinkInterfaceStatus,void *Mes, int MesLength, DWORD Para )
{
switch( uMsg ){
case VS_SOCKET_ONDISCONNECT : //关闭链接
case VS_SOCKET_ONRECEIVE : //收到参数包,参数包中包含多个参数,可以是整形,字符串,浮点型数据。
case VS_SOCKET_ONRECEIVEBIN : //收到二进制数据,内容在缓冲区Mes中,长度为MesLength。
}
}
d.平台消息循环
while ( true ){
SRPControlInterface -> SRPDispatch( true );
}
BasicSRPInterface -> Release();
SRPControlInterface -> Release();
2.客户端
a.初始化SRP平台,获取接口
参见上文
b.建立服务器连接
BasicSRPInterface -> SetupSocketClient( "", "127.0.0.1", 3030, VS_SockEventCallBack,0);
VS_SockEventCallBack为回调函数:
void VS_SockEventCallBack( void *Machine, DWORD uMsg, DWORD MachineID, DWORD LinkInterfaceStatus, void *Mes, int MesLength, DWORD Para )
{
switch( uMsg ){
case VS_SOCKET_ONCONNECT : //建立连接
BasicSRPInterface -> SetupSocketTimer( MachineID, 1, 0 );
break;
case VS_SOCKET_ONTIMER : //定时器超时之后发送
BasicSRPInterface -> SocketSendBin( ClientConnectionID , CLIENTPKG_SIZE, ClientPkgBuf , false );
break;
case VS_SOCKET_ONDISCONNECT :
break;
case VS_SOCKET_ONRECEIVE :
break;
case VS_SOCKET_ONRECEIVEBIN :
break;
}
}
c.平台消息循环
while ( true ){
SRPControlInterface -> SRPDispatch( true );
}
BasicSRPInterface -> Release();
SRPControlInterface -> Release();
二:使用lua语言开发
1.服务器端
a.初始化SRP平台
if _InitServer(true,true,true,true,"",0,"",0) == false then
return
end
_ShowWindow()
_SetIdleActive(true)
_SetCaption("Raw Socket Server")
b.侦听服务器端口
ClientID = _SetupSocketServer("", 3030, AcceptFunc )
function AcceptFunc( ConnectionID, IPAddr, IPPort, MachineID )
return ClientFunc
end
c.处理客户连接和消息收发
function ClientFunc( uMes,MachineID, LinkInterfaceStatus, Para1, Para2 )
if uMes == 2 then
print( "Client ",MachineID,Para1,"Connect" )
end
if uMes == 3 then
print( "Client ",MachineID,"Dis Connect" )
end
if uMes == 5 then
print( "Client ",MachineID,"Data :" )
print( " ",Para1[0] )
print( " ",Para1[1] )
print( " ",Para1[2] )
end
end
2.客户端
a.初始化SRP平台
同上文
b.建立服务器连接
ClientID = _SetupSocketClient("", "127.0.0.1", 3030, ClientFunc )
function ClientFunc( uMes,MachineID, LinkInterfaceStatus, Para1, Para2 )
if uMes == 2 then
print( "Connect To Server" )
Para = _NewParaPkg()
Para[0] = 123
Para[1] = 456.5676
Para[2] = "askljgasdl;gjdfg"
_SocketSend( MachineID, Para, false )
end
if uMes == 3 then
print( "Dis Connect To Server" )
end
if uMes == 4 then
print( "Fail Connect To Server" )
end
end
完整例程接口描述,包括C/C++和Lua,请参见SRP平台服务器端安装包。