# JMEngine
**Repository Path**: JimmyH/JMEngine
## Basic Information
- **Project Name**: JMEngine
- **Description**: 一个主要用于游戏服务器的网络框架, boost使用较多
- **Primary Language**: C++
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 26
- **Forks**: 11
- **Created**: 2015-06-19
- **Last Updated**: 2024-01-23
## Categories & Tags
**Categories**: game-dev
**Tags**: None
## README
#JMEngine
开发环境选择
windows: vs2012以上(vs2012为支持可变模板参数,编译器需要使用vc_compilerCTPNov2012,external提供下载)
linux: gcc 4.8.1以上
c++ 网游服务器框架代码
网络:网络层使用boost::asio编写, 并再此之上封装了一个异步rpc调用模块, rpc协议使用protobuf, 支持超时
client -> server
```cpp
class ClientHandler final : public JME_NetHandler
{
public:
void sessionConnectSucceed(JME_TcpSession::JME_TcpSessionPtr session)
{
session->start(1);
}
void sessionConnectFailed(JME_TcpSession::JME_TcpSessionPtr session, boost::system::error_code e)
{
}
void sessionDisconnect(JME_TcpSession::JME_TcpSessionPtr session, boost::system::error_code e)
{
}
void sessionReceiveMessage(JME_TcpSession::JME_TcpSessionPtr session, JME_Message::JME_MessagePtr msg)
{
}
void sessionReadError(JME_TcpSession::JME_TcpSessionPtr session, boost::system::error_code e)
{
}
};
int main()
{
JMECore.start();
auto client_handler = boost::shared_ptr(new ClientHandler);
auto client_session = JME_TcpSession::create(client_handler, 10240, 5);
client_session->connect("127.0.0.1", "2010");
while (1)
{
string cmd;
cin >> cmd;
if (!cmd.compare("quit"))
{
break;
}
}
JMECore.stop();
return 0;
};
```
server <- client
```cpp
class AcceptorHandler :
public JME_NetHandler
{
public:
void sessionConnectSucceed(JME_TcpSession::JME_TcpSessionPtr session)
{
session->start(1);
}
void sessionConnectFailed(JME_TcpSession::JME_TcpSessionPtr session, boost::system::error_code e)
{
}
void sessionDisconnect(JME_TcpSession::JME_TcpSessionPtr session, boost::system::error_code e)
{
}
void sessionReceiveMessage(JME_TcpSession::JME_TcpSessionPtr session, JME_Message::JME_MessagePtr msg)
{
}
void sessionReadError(JME_TcpSession::JME_TcpSessionPtr session, boost::system::error_code e)
{
}
};
int main()
{
JMECore.start();
auto acceptor_handler = boost::shared_ptr(new AcceptorHandler);
auto acceptor = JME_TcpAcceptor::create(acceptor_handler, 2010);
acceptor->accept(0, 1024);
while (1)
{
string cmd;
cin >> cmd;
if (!cmd.compare("quit"))
{
break;
}
}
JMECore.stop();
return 0;
};
```
日志:自主封装的日志库,支持按文件大小分割日志, 动态更改日志级别, 日志输出到文件采用独立线程
内存:使用开源内存池 nedmalloc
数据库:封装有一个通用的数据库连接池
```cpp
typedef JMEngine::db::DBHelper MongoDBHelper;
typedef JMEngine::db::DBPool MongoDBPool;
bool connect(mongo::DBClientConnection* conn, const string& ip_str, const string& db_name, const string& name, const string& pwd)
{
string err = "";
if (!conn->connect(ip_str, err))
{
LOGE(err);
return false;
}
if (!conn->auth(db_name, name, pwd, err))
{
LOGE(err);
return false;
}
return true;
}
int main()
{
MongoDBPool::DBPoolPtr _gdDBPool = MongoDBPool::create(n, boost::bind(&connect, _1, ip_str, db_name, name, pwd));
try
{
MongoDBHelper conn(_gdDBPool);
mongo::BSONObj b = conn->findOne(db_name_str, query.obj(), fileds);
if(b.isEmpty())
return 1;
Json::Value val;
Json::Reader reader;
reader.parse(b.jsonString(),val);
val.removeMember("_id");
return 0;
}
catch(const JMEngine::db::JME_DBException& err)
{
LOGE(err.what());
}
return 1;
}
```
2015/12/31 新增 简单udp监听
```cpp
class UdpHandler :
public JME_UdpNetHandler
{
public:
void onReceive(JME_UdpSessionPtr session, JME_MessagePtr msg)
{
//逻辑线程处理接收到的消息
session->writeMessage(*msg);
}
void onWrite(JME_UdpSessionPtr session)
{
//处理完一条消息后,才能继续接受下一条消息
session->startRead();
}
};
int main()
{
JMECore.start();
auto udp_handler = boost::shared_ptr(new UdpHandler);
auto udp_session = JME_UdpSession::create(udp_handler, 6002, 10240);
udp_session->startRead();
while (1)
{
string cmd;
cin >> cmd;
if (!cmd.compare("quit"))
{
break;
}
}
JMECore.stop();
return 0;
};
```
相关第三方库列表
protobuf
boost.1.49.0
相关使用示例在 TestServers项目里
地址: https://git.oschina.net/JimmyH/TestServers