前言 有不对的地方希望大家多多指正
socket实现网络聊天室,是一个服务器,多个客户端,主要就是发送与处理消息,文末是源码
MFC是实现图形化界面,但是MFC的消息机制,不允许在一个消息里面实现循环接受socket的消息,所以需要一个线程来接收。
写程序前要先确定好需求再去完成代码
需求 服务器 页面
- 显示在线人的名称、ip地址
- 显示在线人数
- 显示处理客户端发出的请求 消息
需求 用户 页面
-
注册页面:
- 页面样式:输入用户名、两次密码确认、确认按钮、清空密码按钮
- 完成功能:显示用户注册成功、是否重复注册
-
登陆页面:
- 页面样式:输入用户名与密码,登陆按钮、注册按钮、清空按钮、输入服务器IP按钮【本来想在区域网内两台电脑测试一下,不是知道 输入服务器IP连接不上】
- 完成功能:是否注册、密码是否正确、是否重复登陆、登陆成功后跳到聊天页面
-
聊天页面
- 页面样式:好友列表,显示聊天信息框、输入消息框、发送消息按钮、清空聊天信息按钮、刷新好友列表按钮、显示在线人数、显示当前聊天人
- 完成功能:接受消息与发送消息、显示好友与人数、显示消息记录
用到的组件
按钮 为 button按钮
Static Text: 显示提示文字
Edit Control编辑框:输入用户名、密码、显示处理消息、显示聊天记录
List Control 表单:显示列表在线人数列表、好友列表
需求 服务器与客户端 处理的内容
- 最基本的,一直接受客户端发过来的请求(在MFC创建线程)
- 用户的注册请求(【消息格式:R用户名#密码】)
-
对客户端回复
- 是否重复注册,并返回客户端 【消息格式:N】
- 注册失败,服务器无法完成注册【消息格式:N】
- 注册成功,给客户端发送请求【消息格式:Y】
-
服务器处理消息
- 是否重复注册,并向客户端返回
- 将用户名与密码写入保存,并将结果返回给客户端
- 显示注册信息
- 用户的登录请求(【消息格式:L用户名#密码#端口】)
-
对客户端的回复
- 未注册过 【消息格式:0 】
- 密码错误 【消息格式:1 】
- 重复登陆 【消息格式:2 】
- 登陆成功 【消息格式:Y】
-
服务器处理消息
- 取出用户名检查是否注册,显示用户名未登陆
- 核对用户名密码是否正确,显示用户名未注册
- 是否已登陆,显示用户名重复登陆
- 登陆成功,显示用户名登陆,显示在线人数与在线人数列表
4.用户的聊天功能实现
- 客户端获取在线人数列表请求【消息格式:PL】
- 服务器回复在线人数列表【消息格式:用户名#用户名…$】 最后一个符号位结束符
-
客户端发过来的聊天请求【消息格式:PM发送人#接收人#聊天内容】
-
接收人为非群聊 向客户端回复
- 转发成功【消息格式:Y】
- 好友未在线【消息格式:N】
-
接收人为非群聊 服务器处理的消息
- 判断是否在线
- 转发消息,并显示发送人-》接收人:聊天内容
-
接收人为群聊 向客户端回复
- 转发成功【消息格式:Y】
- 转发失败【消息格式:N】
-
接收人为群聊 服务器处理的消息
- 转发消息,并向客户端回复
- 显示来群聊:聊天内容
-
接收人为非群聊 向客户端回复
4.用户退出请求 【消息格式:E用户名】
- 服务器处理消息 根据用户名删除在线列表,删除窗口列表、更改显示认识、显示退出信息
补充
- 服务器有一个线程循环监视客户端发来的请求,客户端的聊天页面时一直循环接受服务器发过来消息
- 显示页面聊天用的自定义消息机制
- 服务器处理发过来的用户名、存储文件都是用的服务器类、还有一个存储在线人的信息类、服务器用容器存储在线人信息
vxid:y2638092197
只要实现了客户端与服务器的通信,就可以实现各种操作。做的这个没有很优化,还可以添加很多功能,代码也可以做很多优化
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200118153500837.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMTI3MDgw,size_16,color_FFFFFF,t_70)
打开文件,运行文件可能不成功,需要改东西
源码
[
如果哪一天我收费了,那是我真的需要钱了,而不是我想赚钱了
]
版权声明:本文为qq_40127080原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。