游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1071|回复: 0

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

[复制链接]

17

主题

22

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2008-2-13 21:04:00 | 显示全部楼层 |阅读模式
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 = :oadLibrary( "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平台服务器端安装包。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 01:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表