编码前准备
Ubuntu Linux下载boost库:https://blog.csdn.net/m0_62275194/article/details/137571276?spm=1001.2014.3001.5502
Ubuntu Linux下载Muduo网络库:
https://blog.csdn.net/m0_62275194/article/details/137610012?spm=1001.2014.3001.5502
实现VS Code远程连接Ubuntu虚拟机进行编译
编码
1.组合TcpServer对象
2. 创建EventLoop事件循环对象的指针
3.明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数
4.在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数
5.设置合适的服务端线程数量,muduo库会自己分配I/O线程和worker线程
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <iostream>
#include <functional>
#include <string>
using namespace std;
using namespace muduo;
using namespace muduo::net;
using namespace placeholders;
class ChatServer
{
public:
ChatServer(EventLoop *loop,
const InetAddress &listenAddr,
const 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));
// 设置服务器的线程数量 1个I/O线程,3个工作线程
_server.setThreadNum(4);
}
// 开启事件循环
void start() {
_server.start();
}
private:
TcpServer _server;
EventLoop *_loop;
// 处理用户的连接创建和断开
void onConnection(const TcpConnectionPtr &conn)
{
if(conn->connected()){
cout << conn->peerAddress().toIpPort() << "->" << conn->localAddress().toIpPort() << "state:online" << endl;
}else{
cout << conn->peerAddress().toIpPort() << "->" << conn->localAddress().toIpPort() << "state:offline" << endl;
conn->shutdown();
}
}
// 处理用户的读写事件
void onMessage(const TcpConnectionPtr &conn,
Buffer *buffer,
Timestamp time)
{
string buf = buffer->retrieveAllAsString();
cout << "recv data:" << buf << " time:" << time.toString() << endl;
conn->send(buf);
}
};
int main(){
EventLoop loop;
InetAddress addr("127.0.0.1", 6000);
ChatServer server(&loop, addr, "ChatServer");
server.start();
loop.loop(); // epoll_wait以阻塞方式等待新用户连接,已连接用户的读写事件等
return 0;
}
运行
创建两个后台终端:
登录服务器端,连接客户端:
退出服务器端:Ctrl + ]
其中创建服务器: