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