简介
面向对象的C++课程设计,具体代码见https://gitee.com/hingupup/chat_dome.git,用的VS2019,希望对你能有帮助。
一 、设计思路
本系统采用CS架构(Client-Server架构)将服务器和客户端分离,使得它们可以独立地进行开发和维护。考虑到在聊天室中,确保消息的准确传输非常重要,因此使用TCP协议提供可靠的数据传输,确保数据的完整性和有序性。并且TCP是面向连接的协议,需要在通信双方建立连接后才能进行数据传输。这使得服务器可以跟踪客户端的连接状态,更方便地管理和控制聊天室的用户。为实现聊天室功能,系统应遵循以下设计思路:
(1)服务器端设计:
创建服务器程序,用于接收和处理客户端的连接请求。
维护客户端的连接列表,以跟踪在线用户。
接收客户端发送的消息,并能转发或广播给所有在线用户。
处理用户加入和退出聊天室的操作。
(2)客户端设计:
创建客户端程序,用于连接服务器并参与聊天。
建立与服务器的连接,发送连接请求。
接收服务器发送的消息并显示在客户端界面上。
提供用户界面,包括输入框和发送按钮,使用户能够输入和发送消息。
处理用户加入和退出聊天室的操作。
向在线用户发起私聊。
(3)用户交互
用户打开客户端,输入服务器的地址和端口号以及自己的用户名进行连接。
一旦连接成功,用户可以输入消息并发送给服务器。
服务器将接收到的消息转发或广播给用户,客户端显示接收到的消息。
用户可以看到其他用户发送的消息,并可以发送自己的消息。
用户能知道目前有哪些用户在线,并向某一用户发起私聊。
二 、类库设计
本系统主要是利用Windows套接字进行TCP通信,基于 MFC 已经封装好的CSocket类派生了CComuSocket 类、CListenSocket类和ClientSocket 类。
对于服务器端,CComuSocket 类负责与客户端通信,其成员变量和成员函数如下图2.1。
图2. 1 CComuSocket 类
CListenSocket类负责监听和管理连接的客户端套接字,其成员变量和成员函数如下图2.2。
图2.2 CListenSocket 类
对于客户端,ClientSocket 类负责连接服务器以及与服务器通信。
图2.3 ClientSocket类
三、
3.1界面设计
按照需求对服务器端和客户端的界面进行设计,服务器控件的具体摆放如下图3.1,客户端控件的具体摆放如下图3.2。
图3.1服务器界面
图3.2 客户端界面
3.2 构造函数
服务器的CComuSocket 类和 CListenSocket 类以及客户端的ClientSocket 类均是继承的CSocket类。为了能与主对话框进行数据交互,需要获得主窗口的指针,所以对构造函数进行了重载如图3.3。
图3.3 重载构造函数
3.3 连接与断开
客户端进行连接时,服务器要保持开启状态,分配某一端口进行监听。服务器端首先创建一个监听套接字,该套接字将对用户设置的端口进行监听,处于阻塞状态等待客户端的连接。启动服务器具体代码见下图3.4。
图3.4 开启服务器
当有客户端连接时,服务器需要做出相应操作,通过监听套接字重写OnAccept()函数,见图3.5。
图3.5 服务器重写OnAccept()
当服务器接受到客户端的连接请求后,监听套接字创建一个通讯套接字CComuSocket与其绑定,同时将其加入套接字链表中,用以管理客户端的信息。并跟新服务器的日志。
客户端与服务器成功连接后应该主动上传自己的用户信息,所以重写了虚函数OnSend(),见下图3.6。
图3.6 客户端重写OnSend()
当服务器端断开时,需要关闭所有套接字,见图3.7。
图3.7 关闭所有套接字
服务器端断开后,客户端需要与用户进行信息交互,需重写虚函数OnClose(),见下图3.8。
图3.8 客户端重写OnClose()
当用户退出聊天室时,服务器端需要更新用户信息并广发,同时还要关闭当前通讯套接字。通过CComuSocket类重写OnClose()函数,如图3.9。
图3.9 服务器端重写OnClose()
3.4 消息的接受与处理
服务器端的消息处理主要靠CComuSocket类,客户端的消息处理主要靠CComuSocket类。为了区分消息,在每次发送消息前都加了特定的字符。接收
方通过对首字符的判断来进行相应的处理。具体处理见下图3.10。
图3.10 消息解析
当服务器和客户端的缓存区接收到数据后,通讯套接字会调用OnReceive() 来接受消息。服务器端通过CComuSocket类重写虚函数OnReceive(),实现跟新在线用户,转发消息和群发消息。先通过Receive()将缓冲区的数据调出来。
再调用消息处理函数DisposeMessages()对消息进行区分。 对不同的信息做相应的处理,如下图3.11—图3.13。
图3.11 用户信息
图3.12 公屏消息
图3.13私聊消息
客户端是通过CClientSocket类重写虚函数OnReceive(),实现跟新在线用户,接受显示消息以及与用户交互。见图3.14。
图3.14 客户端消息处理