winform项目——仿QQ即时通讯程序14:接收、存储验证消息

上一篇文章,我们的CIM项目已经做到发送验证消息了,本篇文章将实现验证消息的接收和存储。

编程思路

既然已经实现了发送验证消息,如何对方在线,消息将直接转发给用户,如果不在线,则存储在数据库等待用户上线后转发给用户。不管是哪一种情况,客户端必须具有接受验证消息的功能。

验证消息

步骤1:我们需要在客户端程序上写一个实时接收服务端消息的方法。我们已经在前面提到过将普通消息和验证消息以类似的方式进行区分,因此这个接收消息的方法中必须要能够按照规则区分两种类型的消息。

步骤2:接收到验证消息后如何表现到界面上。也就是说怎样显示在会话列表中。

步骤3:如何在本地存储验证消息记录

本篇文章我们就要实现这三个步骤就能完成目标。那么开始吧。

客户端接收消息功能实现

我们要提一下之前的原则:客户端要时刻接收消息,必须开启独立的线程。所有的消息记录都将存储在本地。所以接收到消息后不仅要在界面上显示,还有在后台存储到本地文件中。

在Major主窗体的加载事件中补充一个线程:

//开启线程接收服务端发来的消息
Thread receiveThread = new Thread(receiveMsg);
receiveThread.IsBackground = true;
receiveThread.Start();

接着是receiveMsg的具体实现:

/// <summary>
        /// 实时接收服务端消息
        /// </summary>
        private void receiveMsg()
        {
            //死循环保证能一直接收消息
            while (true)
            {
                byte[] buffer = new byte[1024];
                int len = Common.socket.Receive(buffer);
                //该msg可以是普通消息,也可以是验证消息
                string msg = Encoding.UTF8.GetString(buffer, 0, len);
                //通过split将msg中的数据拆分出来
                string[] msgarr = msg.Split(new string[] {Common.splitFlag }, StringSplitOptions.None);
                //通过判断拆分后包含几段来区分是普通消息还是验证消息
                if(msgarr.Length == 3)
                {//是普通消息 先不做
                    MessageBox.Show("1");//测试用
                }
                else if(msgarr.Length ==2)
                {//是验证消息
                    //判断是否是验证消息的反馈,暂时只识别“同意”反馈
                    string[] text = msgarr[1].Split(new string[] {"~~~" }, StringSplitOptions.None);
                    if (text.Length == 3&&text[0] == "" && text[1] == "同"&& text[2]=="意")
                    {//说明是验证消息的反馈
                        //加载和对方的会话
                        TalkMessage tm = new TalkMessage();
                        tm.Account = msgarr[0];
                        tm.SubMessage = "你已和"+tm.Account+"成为好友";
                        //geiNickName是之前写好的函数
                        tm.NickName = getNickName(tm.Account);
                        //之前写好的loadtalk方法
                        //获取返回值的目的是为了后面判断该会话是否存在
                        Panel talkpanel = loadtalk(0,tm);
                        Common.existedTalk.Add(tm.Account, talkpanel);
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值