ChatServer
服务器的网络模块代码借助于muduo网络库,服务器通过muduo网络库来进行通信。
chatserver.hpp
首先,我们在include下的server下创建头文件chatserver.hpp:
#ifndef CHATSERVER_H
#define CHATSERVER_H
#include <muduo/net/EventLoop.h>
#include <muduo/net/TcpServer.h>
using namespace muduo;
using namespace muduo::net;
//聊天服务器主类
class ChatServer
{
public:
//初始化聊天服务器对象,构造TCPServer
ChatServer(EventLoop *loop,
const InetAddress &listenAddr,
const string &nameArg);
//启动服务
void start();
private:
//连接到来时的回调函数
void onConnection(const TcpConnectionPtr &);
//读写事件到来时的回调函数
void onMessage(const TcpConnectionPtr &,
Buffer *,
Timestamp);
//muduo库中的服务器类
TcpServer _server;
//muduo库中的事件循环指针
EventLoop *_loop;
};
#endif
chatserver.cpp
接下来我们在src下的server下创建文件chatserver.cpp:
#include "chatserver.hpp"
#include "chatservice.hpp"
#include "json.hpp"
#include <functional>
#include <iostream>
#include <string>
using namespace std::placeholders;
using json = nlohmann::json;
//初始化聊天服务器对象
ChatServer::ChatServer(EventLoop *loop,
const InetAddress &listenAddr,
const std::string &nameArg)
: _server(loop, listenAddr, nameArg), _loop(loop)
{
//设置服务器回调函数
_server.setConnectionCallback(std::bind(&ChatServer::onConnection, this, _1));
_server.setMessageCallback(std::bind(&ChatServer::onMessage, this, _1, _2, _3));
_server.setThreadNum(4);
}
//启动服务器
void ChatServer::start()
{
_server.start();
}
//连接到来时的回调函数
void ChatServer::onConnection(const TcpConnectionPtr &conn)
{
//客户端断开连接
if (!conn->connected())
{
ChatService::instance()->clientCloseException(conn); //客户端异常关闭
conn->shutdown(); //关闭文件描述符
}
}
//读写事件到来时的回调函数
void ChatServer::onMessage(const TcpConnectionPtr &conn,
Buffer *buffer,
Timestamp time)
{
//将buffer中的序列化数据转换成string接收
std::string buf = buffer->retrieveAllAsString();
std::cout << buf << std::endl;
//将buf反序列化为一个json对象
json js = json::parse(buf);
//通过js["msgid"] 获取消息的handler处理器(在业务模块事先绑定好的)
auto msgHandler = ChatService::instance()->getHandler(js["msgid"].get<int>());
msgHandler(conn, js, time); //回调消息绑定好的handler处理器,来执行相应的操作
}