JMEngine
Выбор среды разработки:
Код C++ для серверной части веб-игры написан на основе фреймворка JMEngine.
Сетевая часть: сетевой уровень реализован с использованием библиотеки Boost::asio, которая обеспечивает асинхронный обмен данными между клиентом и сервером. RPC-протокол основан на библиотеке Protobuf, что позволяет устанавливать таймауты при обмене данными.
Клиентская часть:
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<ClientHandler>(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;
};
Серверная часть:
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<AcceptorHandler>(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.
База данных: реализована общая библиотека соединений с базой данных.
typedef JMEngine::db::DBHelper<mongo::DBClientConnection> MongoDBHelper;
typedef JMEngine::db::DBPool<mongo::DBClientConnection> 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-сервер.
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<UdpHandler>(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;
};
Список используемых библиотек:
Примеры использования: доступны в проекте TestServers на сайте https://git.oschina.net/JimmyH/TestServers.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )