基于 MFC 的网络聊天室

该文介绍了基于C++的面向对象课程设计,构建了一个使用TCP协议的CS架构聊天系统。服务器和客户端分别由CComuSocket、CListenSocket和ClientSocket类实现,处理连接、消息传递及用户交互。系统允许用户私聊和查看在线用户,服务器端通过套接字链表管理客户端连接。
摘要由CSDN通过智能技术生成

简介

        面向对象的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 客户端消息处理

     

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值