1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/JimmyH-JMEngine

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

JMEngine

Выбор среды разработки:

  • Windows: VS2012 и выше (VS2012 поддерживает вариативные параметры шаблона, для компилятора необходимо использовать vc_compilerCTPNov2012, external предоставляет ссылку для скачивания).
  • Linux: GCC 4.8.1 и выше.

Код 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;
};

Список используемых библиотек:

  • Protobuf.
  • Boost 1.49.0.

Примеры использования: доступны в проекте TestServers на сайте https://git.oschina.net/JimmyH/TestServers.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
GPL-3.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/JimmyH-JMEngine.git
git@api.gitlife.ru:oschina-mirror/JimmyH-JMEngine.git
oschina-mirror
JimmyH-JMEngine
JimmyH-JMEngine
master