局域网聊天系统__5.客户端业务逻辑与框架

      客户端的需求在前面已经分析了。这里是客户端的业务逻辑:
     1.初始化:
               初始化用户界面(主要是列表控件)
               创建并开启监听套接字
     2. 用户登录:
               弹出登录对话框 让用户输入用户名密码以及服务器信息
               根据用户输入的服务器信息创建一个新的套接字连接服务器 并且请求用户链表
               等待该套接字可读数据 如果是服务器发送的错误消息 则弹出消息框并退出 登录失败
                                                如果是服务器发送的用户链表 则刷新界面 登录成功
     3.收到离线消息:
               在登录成功后,服务器会检查有无该用户的离线消息,客户端在收到该离线消息后,显示该消息,如果用户点击回复,则建立一个新的聊天对话框。
     4.用户聊天:
               用户聊天主要是在聊天对话框中完成的,由于其不经由服务器转发,因此每个聊天对话框需要维护必要的数据用于用户聊天。主要有:通信双方的用户信息和通信套接字以及用户支持序列化的一些列对象(CSocketFile CArchive)
               主动聊天:双击用于列表上某个用户即可开始聊天 
                    如果目标用户在线   创建一个聊天对话框,并且连接到目标用户(连接的套接字由聊天对话框维护),显示聊天对话框。之后即在该对话框内完成与对方的聊天
                    如果目标用户离线   创建并显示聊天对话框,当对话框被关闭后,由客户端主窗口获取聊天对话框中的用户输入,并将离线消息发送到服务器(这样避免只为发一条离线消息而连接服务器)
               被动聊天:当用户的监听套接字收到新的连接请求,此时即为有其他用户请求聊天
                      从用户列表中找到请求聊天的用户信息(根据用户请求的IP地址),然后根据这些信息创建聊天对话框。

需要注意的地方:
     客户端登录在向服务器发送请求用户链表时,自身信息的IP通过聊天套接字得到 而端口则获取的是监听套接字的端口(这样其他用户才能够通过用户信息中的端口向你发送聊天请求)。
     由于聊天套接字由聊天对话框管理,因此当聊天对话框被用户A关闭时,也将销毁聊天套接字,这个时候如果与之聊天的用户B继续发送消息将遇到错误。因此这里简便处理为一方关闭对话框后,另一方也随之关闭。针对与本程序的通信机制,解决这个问题大概有以下思路:如果要在一用户A关闭对话框后就销毁套接字,那么就需要在用户B再次发送数据时,重新连接A。这需要B设立一个变量bPeerWindowClose来标识A是否关闭了连接(该变量在通信套接字OnClose处为True,在Accept或Connect成功后设为False),B每次在发送数据时,检测该变量,用以判断是否需要先重新请求连接(连接后需要更新连接套接字)。另一种方案是A关闭对话框后不销毁套接字,这样就要将聊天套接字的管理权交由主窗口,套接字本身有可读数据时,先由主窗口判断对应窗口是否打开,未打开则先打开窗口显示消息,否则直接传入显示消息到聊天对话框。当A B都关闭了对话框时,主窗口才释放聊天套接字。
     
                     完整源代码下载地址 点击这里 http://download.csdn.net/detail/wudaijun/4911762
               
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值