• 分享一直在维护简单实用高效的C++Socket框架Swa-server(开源+源码)


    Swa-server 开源框架
    * 适用于中小型游戏,如:养成、RPG、棋牌等;应用软件,如:聊天室等
    * 已经封套好底层socket管理,sql请求处理、数据加密解密
    * 拿来即可开工写业务
    * Swa-server是面向小型快速开发的框架,所以采用单进程模式,以后更新也是单进程方案去解决所遇到的问题,这样可以减少开发时间与人力(其实很多服务器用单进程就够了)

    * 支持IO异步(基于boost库IO)
    * 支持sql异步执行(有回调函数)
    * 玩家管理器
    * 数据库管理器

    项目中例子
    * 1、请求获得动态密码
    * 2、请求登录(包括mysql查询处理返回等)

    安装流程
    * 1、安装一个vs2012
    * 2、下载本项目的代码
    * 3、下载第三方库(boost与mysql),mysql已经编译好地址:http://pan.baidu.com/s/1qW7b42S,boost版本过大,自行到官网下载,版本为1.55
    * 4、安装mysql数据库,并导入项目的sql文件
    * 5、编译运行,使用项目中客户端测试

    结构图:

    Shared为了个静态共享库,该库主要包括了socket管理,数据库管理

    运行图

    服务器启动过程 (下面代码):

    int main(int argc, const char * argv[])
    {
    	// 初始化服务器所都要准备好的数据 
    	Init();
    
    	// 启动服务 
    	ServerStart();
    
    	// 执行退出的相关操作
    	RunServerExit();
    
    	return 0;
    
    }
    
    void Init()
    {
    
    	// 初始化化协议
    	InitNetMsg();
    
    	// 加载配置
    	g_rGameCfg.LoadRes( "../conf/gameconfig.xml" );
    
    	// 服务器相关配置
    	const GameConfigInfo& rGameCfgInfo = g_rGameCfg.GetGameConfigInfo();
    
    	// 加载服务器需要的资源
    	g_rResourceMgr.LoadAllRes(rGameCfgInfo.arrConfigPath);
    
    	// 初始化数据库
    	if(DBServerInit(rGameCfgInfo))
    	{
    		// 初始化Scoket服务
    		gNetServer = NetServerMgr::Instance()->AddNetServer();
    		gNetServer->SetAddress( rGameCfgInfo.arrServerHost , rGameCfgInfo.nServerPort);
    		gNetServer->SetHandler( OnNetMsgEnter , OnNetMsg , OnNetMsgExit );
    
    		// 初始化待连接玩家数据
    		g_rPlayerMgr.Init(*gNetServer);
    
    		// 启动Socket服务
    		gNetServer->Start();
    
    		FLOG4( "SERVER STARTED." );
    
    		// 辅助命令初始化
    		gGameCommand.Init();
    	}
    }
    

    启动过程做好一切初始化的工作,加载配置、创建所有的socket、player、数据库对象等,然后设置socket连接、收到消息、退出的回调函数

    这里的socket与player的实例ID是一样的,他们也绑定在一起管理,这样很方便

    当一个socket进来就可以直接到了player,当一个socket退出,这时会初始化player与socket数据,然后再设定他们重新等待连接进入

    主要代码在NetSocket,NetServer,Playaer

    NetSocket

    NetServer::NetServer()
    		:   m_cAcceptor( *this )
    	{
    		static int32 s_nIncreaseNetServerID = 0;
    		m_nServerID = ++s_nIncreaseNetServerID;
    		for ( int i = 0 ; i < MAX_SOCKET_CONNECT ; i++ ) 
    		{
    			m_arrSocket[ i ] = new NetSocket( *this );
    		}
    	}
    

    Player

    void PlayerMgr::Init(NetServer& rNetServer)
    {
    	for ( int32 i = 0 ; i < MAX_SOCKET_CONNECT ; i++ )
    	{
    		SWA::NetSocket& pSocket = rNetServer.GetSocket(i);
    		ASSERT(pSocket.SID() == i);
    		m_arrPlayerCache[i] = new Player(pSocket);
    	}
    }
    

    如果园友想直接用,就直接看例子代码即可上手,如果想研究了解,则多看Shared中的NetSocket,NetServer,NetIOBuffer类等类

    如果园友有什么问题可以在这里提问,或联系我QQ:296464231

    源码已经放到了github : https://github.com/huangzuduan/swa-server

  • 相关阅读:
    ubuntu下环境变量
    Linux/Unix里,ln -s
    ubuntu安装和查看已安装
    Android系统中 setprop,getprop,watchprops命令的使用
    js中Math.random()生成指定范围数值的随机数
    mysql下sql语句 update 字段=字段+字符串
    铁道部2012年版全国72个铁路枢纽城市
    phprpc 使用实例(例实没错却不能执行)函数冲突gzdecode
    电脑开机一直蓝屏,一直重启要怎么办?
    电脑重装系统重装不了,老是蓝屏,是不是硬盘烧坏了!
  • 原文地址:https://www.cnblogs.com/hellohuang/p/4263970.html
Copyright © 2020-2023  润新知