环境,centos7虚拟机,visual studio2019远程开发
muduo网络库提供了两个主要的类
TcpServer:用于编写服务器
TcpClient:用于编写客户端
epoll + 线程池模型,把网络I/O代码和业务代码分开(用户的连接和断开,用户的可读写时间是我们需要关心的。)
TcpServer构造函数
TcpServer(EventLoop* loop, //事件循环
const InetAddress& listenAddr, //封装好的类,绑定IP地址跟端口号
const string& nameArg,//该server的名字
Option option = kNoReusePort); //TCP协议的选项
#include<functional>
using namespace std;
using namespace muduo::net;
using namespace muduo;
class ChatServer {
public:
ChatServer(EventLoop* loop,
const InetAddress& listenAddr,
const string& nameArg) : _server(loop, listenAddr, nameArg), _loop(loop) {
//给服务器注册用户的连接断开回调
_server.setConnectionCallback(bind(&ChatServer:: onConnection, this, _1));
//给服务器注册用户的读写回调
_server.setMessageCallback(bind(&ChatServer::onMessege, this, _1, _2, _3));
//设置服务器端的线程数量,一个I/O线程,三个工作线程
_server.setThreadNum(4);
}
//开启事件循环
void start() {
_server.start();
}
private:
//专门处理用户的连接和断开
void onConnection(const TcpConnectionPtr& conn) {
if (conn->connected()) {
cout << conn->peerAddress().toIpPort() << "->" << conn->localAddress().toIpPort() << endl;
//_loop->quit();
}
else
{
conn->shutdown(); //close(fd)
cout << "offline" << endl;
}
}
//专门处理用户的读写事件
void onMessege(const TcpConnectionPtr& conn,//连接
Buffer* buffer, //缓冲区
Timestamp time ) //接收到信息的时间信息
{
string buf = buffer->retrieveAllAsString();
cout << "recv data:" << buf << "time: " << time.toString() << endl;
conn->send(buf);
}
TcpServer _server;
EventLoop* _loop;
};
int main()
{
EventLoop loop;
InetAddress addr("127.0.0.1", 6000);
ChatServer server(&loop, addr, "chatserver");
server.start(); //listenfd epoll_ctl->epoll
loop.loop(); //epoll_wait,已阻塞方式等待用户的连接读写操作。
return 0;
}
事实上,使用muduo网络库我们不用过多去关注连接的过程,只需要关注onConnection和onMessege这两个回调函数,其他的代码几乎是写死的,通过这个简单的测试可以启动一个回声服务器
一个基本的基于muduo库的服务器就建好了