📅  最后修改于: 2023-12-03 15:22:18.204000             🧑  作者: Mango
本篇介绍了一个使用C++ Boost库中的asio库创建基于TCP协议的同步聊天应用程序的方法。
我们需要实现一个基于TCP的聊天应用程序,其中:
我们需要定义一个消息格式,包括消息头和消息体。
struct Header {
uint32_t body_size{ 0 };
};
struct Message {
Header header;
std::string body;
};
io_context
对象,用于每个连接的socket
类acceptor
对象,用于处理来自客户端的连接请求,并接受连接boost::asio::io_context io_context;
boost::asio::ip::tcp::acceptor acceptor(io_context, endpoint);
void session(boost::asio::ip::tcp::socket client_socket) {
try {
std::array<char, 8192> buffer{ 0 };
while (true) {
boost::system::error_code ec;
std::size_t length = client_socket.read_some(boost::asio::buffer(buffer), ec);
if (ec == boost::asio::error::eof) {
break;
}
if (length > 0) {
Message msg;
std::memcpy(&msg.header, buffer.data(), sizeof(msg.header));
msg.body.resize(msg.header.body_size);
std::memcpy(msg.body.data(), buffer.data() + sizeof(msg.header), msg.header.body_size);
std::cout << "Received: " << msg.body << std::endl;
// 将消息发送给其他客户端
for (auto& session : sessions) {
boost::asio::write(session.socket, boost::asio::buffer(buffer, length), ec);
}
}
}
} catch (std::exception& e) {
std::cerr << "Exception in thread: " << e.what() << std::endl;
}
}
注意事项:
client_socket
用于与客户端通信,处理网络I/O操作boost::asio::io_context
创建一个tcp::socket
boost::asio::io_context io_context;
boost::asio::ip::tcp::socket socket(io_context);
boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::address::from_string(ip), port);
void receive() {
try {
std::array<char, 8192> buffer{ 0 };
while (true) {
boost::system::error_code ec;
std::size_t length = socket.read_some(boost::asio::buffer(buffer), ec);
if (ec == boost::asio::error::eof) {
break;
} else if (length > 0) {
std::string message(buffer.data(), length);
std::cout << "Received: " << message << std::endl;
}
}
} catch (std::exception& e) {
std::cerr << "Exception in thread: " << e.what() << std::endl;
}
}
客户端可以通过cin
输入消息并发送到服务端
std::string message;
while (std::getline(std::cin, message)) {
Message msg;
msg.header.body_size = message.size();
msg.body = message;
boost::asio::write(socket, boost::asio::buffer(&msg.header, sizeof(msg.header)));
boost::asio::write(socket, boost::asio::buffer(msg.body));
}
注意事项:
以上便是使用C++ Boost库中的asio库创建基于TCP协议的同步聊天应用程序的全部内容。
完整代码请参考GitHub。