c++服务端,winform客户端,聊天项目接口设计

c++服务端,winform客户端,聊天项目接口设计

客户端功能介绍:
一:框架介绍
1)客户端创建socket 并连接服务器(代码在主函数,提供服务器的ip和端口号)
2)连接成功后弹出登陆界面,
如果未注册:单机注册按钮->进入注册界面->输入用户名,密码和确认密码->点击注册,向服务器发送1001注册消息,完成注册;
如果已注册:输入用户名和密码点击登陆,同服务器时发送1002登陆消息,随后就可弹出主界面;
3)主界面分为三大块:聊天,通讯录,加好友 ,主界面load时会做两件事:1发送1006类型的消息:(查询好友列表)获取本人所有好友,并处理1006查询结果(将好友添加到通讯录,将好友名称加入mesages作为map 的key值); 2,发送1007类型消息,获取本人与所有好友的聊天记录存储在map中;
4)单击加好友按钮,发送1031类型的消息,查询本人有哪些待处理好友;
5)单击dataGridView1中的某一选项,触发CellClick事件,发送1004类型消息;同意消息后四位为0001,拒绝为0002;
6)单击通讯录按钮,发送1006类型的消息,获取好友列表重新加载在listView1中;
7)单击通讯录界面的发消息按钮,判断listView2中已加载的好友是否是listView1现在被选中的用户;如果不是,重新加载该好友到listView2中并添加图片来做头像;
8)单击聊天界面的发送按钮,发消息1005类型消息(正常聊天内容);
二:发送消息分析:
类型 功能 代码实现说明

1001		注册															{
																						发送1001注册消息:1001 用户名长度 用户名 密码长度 密码	
																						接收1001处理结果;“10010000”弹框“恭喜你注册成功”,“10010001”弹框“此用户名已被注册”
																					}
																					
1002		登陆															{
																					发送1002登陆消息:1002 用户名长度 用户名 密码长度 密码
																					接收1002处理结果;“10020000”弹框“恭喜你登陆成功”,“10020001”弹框“用户名或密码错误”

																					}	

1003		处理加好友申请										{
																						发送1003申请添加好友消息:1003 本人长度 本人name 待添加者的长度 待添加者的name;
																						接收1003申请加好友的处理结果:10030000弹框提示“申请已成功提交”,10030001弹框提示“输入的用户名不存在”;
																					}

1004		加好友处理结果										发送1004类型消息 "1004 fA长度 fA fB长度 fB 0001"或"1004 fA长度 fA fB长度 fB 0002";1为同意2为拒绝;
																					
																					
1005		处理聊天内容											{
																						A发送1005类型消息给B:1005 本人长度 本人名字 好友名字长度 好友名字   消息长度 消息内容;
																						B接收A发来的1005类型消息:1005 好友长度 好友名 本人长度 本人名 消息长度 消息内容 时间长度 时间内容
																						B判断是否正在和A聊天,如果是就将聊天内容显示在listView3中,并且将相关内容插入key值为A的message中;
																					}
1031		处理好友表中所有待处理对象      {
																					 发送1031查询待处理好友消息:1031+本人长度+本人name 
																					 接收1031待处理好友查询结果:1031 000n(待处理好友个数)+第一个好友长度+第一个好友名字.......
																					 以 dataGridView1.Columns.Add("", "申请者");的方式添加三列,分别为"申请者",“同意” “拒绝n";
																					 将所以待处理好友以次添加在dataGridView1第一列;
																				}

1006		查询好友列表										{
																					发送1006类型的消息:(查询好友列表)1006+本人长度+本人name
																					接收1006处理结果; 判断好友个数是否大于0,如果等于0表示本人没有好友;如果大于使用for循环遍历得到每
																					一个好友,并加载一个图片显示在通讯录的listView1中;
																					将好友的用户名作为map的key值插入message中;
																				}
																				
1007		查询本人与所有好友的聊天记录   {
																				主页面登陆时发送1007类型消息:1007+本人长度+本人name
																				接收1007处理结果;获取n个消息个数,如果n大于0,遍历n次,获取每一个消息的每一个字段,判断fA如果等于本人用户名,表示消息是fA发给fB的,查找key为fB的map,消息时间前面加“M”并且追加消息内容添加到map中;
																				如果fA不等于本人用户名,表示消息是别人发来的;查找key为fA的map直接将消息内容和时间添加到map中;
																				}

*服务端功能介绍:
一:框架介绍
1)连接数据库;(包含数据库头文件,创建数据库连接对象mysql,调用mysql_real_connect()连接数据,设置sql语句为utf8格式,可以识别中文)。
2)服务端创建socket,绑定ip和端口号,监听socket;
3)将socket装入kqueue队列(创建chage事件,先将socket以只读方式添加到chage事件中,再将chage事件添加到kq中)
4)进入while(1)通过kq监听socket是否有可读事件发生:
(1)如果监听到服务器的负责监听的socket有可读事件,表示有客户端发来连接请求,需要accept,此时会返回一个新的socket描述符,用来做双方通信使用;
(2)如果监听到的可读事件不是服务器的socket发生的事件,表示客户端发来了其它消息,需要recv 读取内容做判断处理,recv()返回消息的大小;
{
如果recv()返回值为0,表示客户端已断开,需要将该socket移除kq,并且从在线map中删除此用户;

																					如果recv()返回值不为0,需要读取每个消息分类处理;
																				
																				
																				}

(5)关闭socket;结束主函数;

二:消息内容处理分析:
类型 功能 代码实现说明

1001		注册																	服务端从消息中获取用户名和密码,判断是否已注册,如果没有注册将注册信息插入数据库的注册表;并且回复客户端1001注册结果;

1002		登陆																	服务端从消息中获取用户名和密码,判断是否注册,如果已注册将用户名和socket加入在线map;并且回复客户端1002登陆结果;

1003		处理加好友申请												先从消息中获取fA和fB的name,判断待添加者是否已注册,如果已注册将相关数据插入friend表,此时状态为0;并且回复fA 1003类型处理结果(10030000表示申请成功提交,10030001表示fB未注册);

1004		处理加好友处理结果								{
																						获取消息内容中fA和fB的name,取最后一个字节判断如果为1,表示同意添加,将fA与fB反向插入friend表,状态为1;
																						最后一个字节为2,表示拒绝,将friend表中状态为0的消息状态设置为1或2;
																					}

1005		处理聊天内容											服务端从消息内容中获取fA和fB的name还有消息内容,然后获取当前系统时间,判断fB如果在线,原消息追加时间然后转发给fB,同时将消息插入message表;

1031		获取并回复好友表中所有待处理对象						获取本人和待添加者的name,查询数据库中的friend表中状态为0,friendB=本人 的记录,如果查询到了记录将结果追加到send_buf发送给客户端;
																							如果没有查到结果,发送“10310000”;

1006 查询好友列表 获取本人name,查询数据库中的friend表,获取本人的所以好友;回复查询结果:1006 好友个数 第一个好友name长度 name …

1007		查询本人与所有好友的聊天记录					{
																								服务端从消息中获取本人用户名,查询message表中关于自己的所以记录,结果集的行数大于0表示查询到了聊天记录;循环结果集追加消息内容并发送给客户端;
																								1007消息格式为:1007 好友个数  fA的长度 fA用户名 fB的长度 fB  聊天内容长度 聊天内容  消息时间长度 消息时间.......(以这样的格式追加所有消息);
																							}

群聊功能:
客户端: 单击创建,申请群发送消息:1008 群主长 群主 群名长 群名 群成员个数 群成员长度 群成员…
客户端加载主界面时,发送1009消息,获取本人有哪些群;
其中一个客户端(群成员)发送了1010消息(群消息)

				客户端收到1010消息,表示一个群消息来到了,就会将次消息存储到群聊map中,若当前聊天窗口,为这个消息所在的群,将此消息加载到聊天窗口中
				
				客户端收到1009消息将所有群名加载到聊天界面的listview2中,将群名作为key值添加到ql_messages中,此时value为空;
				在聊天界面选中某一个群单击,获取这个群的群名和所有群消息,群名显示在lable1中,群消息显示在listview3中;

服务端 (1):在数据库新建群注册表格q_regist,并将群主,群名,群成员个数,群成员插入群注册表;
(2):创建一个map<string,vector> v_member;key=群主+群名,value为群成员;将q_regist中的所有群注册信息保存在map中;
服务端收到1009消息,查询v_member将查询到的所有群名发送给客户端;
服务端收到1010消息后,会到ql_map中查寻此次群的所有成员,并到online 中查到每个成员socket,通过这个socket,发送1010消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值