工具: boost网络库asio
数据结构:list/set/deque
chat_participant{ virtual deliver() }
//用户类:虚函数传递信息
chat_room
{
join(p){ insert; for(auto&m:recent_msgs) p->deliver(msg) }
//for循环不断调用deliver传递信息
leave(p){ erase }
//擦除用户,离开聊天室
deliver(m){ recent_msgs_.push_back(m); pop; for(auto&p:ps) p->deliver(m) }
//将消息放入最近的消息队列,大于容量时弹出部分消息,传递用户消息
std::set<chat_participant_ptr> participants_;
enum{ max_recent_msgs = 100 };
chat_message_queue recent_msgs_;
}
chat_session::chat_participant
{
chat_seesion(sockt, chat_room){}
//socket绑定一个聊天室会话
start(){ room_join; do_read_header() }
//加入聊天室,调用do_read_header()读数据包头
deliver(m) { write_msgs_.push_back(m) ; if(!) do_write() }
//把消息写入,如果没有在写的进程中则调用do_write()
private:
do_read_header(){ async_read(socket_/buffer(read_msg_.data)/do_read_body()}
//异步读数据包头,读完了调用do_read_body();
do_read_body(){ async_read(socket_/buffer(read_msg_.body)/room_.deliver(read_msg_); do_read_header}
//异步读数据包体,读完调用room_deliver()分发消息,处理完处理下一条header
do_write(){ async_write(socket_/buffer/pop; do_write()}
//把数据写入buff,弹出写队列,如果写队列不为空则继续写
tcp::socket socket_;
chat_room &room_;
chat_message read_msg_;
chat_message_queue write_msgs_;
}
chat_server
{
chat_server(ioservice/endpoint){ do_accept() }
//调用do_accept接受连接
do_accept() { async_accept(socket_/session->start()/do_accept()}
//调用start()开启一个会话;持续调用do_accept接受连接开启会话
tcp::socket socket_;
tcp::acceptor acceptor_;
chat_room room_;
}
main(){ std::list<chat_server> servers; servers.emplace_back; io_service.run() }
//把ip端口置入服务器列表里面,运行io_service