这个聊天系统能够达到群聊的目的。当客户端向服务器发送消息,服务器对这条消息进行转发。因为使用的是UDP协议,因此服务器会维护一张用户列表,这个列表记录了全部向服务器发送过消息的客户地址。当某个客户端退出时,会向服务器发送一条特殊的指令,而后服务器将该客户地址从用户列表上删除。服务器
从上图能够看出,服务器端使用生产者消费者模型,生产者从网络中拿数据存到数据池,消费者从数据池中拿数据发送到网络中,从而达到转发的目的,而这个数据池,使用生产者消费者向数据池中写数据和读数据,所谓的数据池也就是一个环形队列而已。网络
因为使用的是UDP协议,因此服务器须要维护一张用户列表,这个用户列表能够使用map,以用户的IP做为key,sockaddr_in做为value.函数
注意:输入消息的时候咱们须要对消息进行序列化和反序列化。为何要这样作呢?咱们不能之直接将客户端输入的内容发送给服务器,由于用户不少的话,最后就没法分别消息是哪一个用户发送的,为此咱们能够给每条消息都加上当前用户的消息。因此客户端给服务器发送的消息是由用户的信息和输入框中的消息拼接而成的。若是用户退出的话,服务器要将该用户从用户列表删除。为此咱们能够再客户端给服务器发送的消息再拼接一个cmd字段,用来表示客户端是否退出。blog
当聊天结束时,客户端退出。咱们能够自定义一个信号处理函数,在信号处理函数中将cmd字段的值设置成非空,服务器拿到数据的时候,先反序列化解析出来cmd的值,判断是否是退出的信息,若是是的话就将该用户从用户列表删除。队列