SRP分布式对象平台中的通信技术(1)-Socket通信

SRP分布式对象平台提供了一种高效灵活的通信解决方案,支持多种编程语言如C/C++和Lua,无需深入了解Socket细节即可实现分布式应用开发。本文详细介绍SRP平台在服务器端和客户端的应用流程,包括初始化平台、建立连接、消息收发等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
       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平台服务器端安装包。
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值