分享一直在維護簡單實用高效的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM