C++.聊天程序::server

工具: 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



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值