上一篇文章完成了验证消息的接收,这篇文章本打算做好友间互发消息,但是做的时候发现会话列表的存储还没做。就是会话列表中有会话的情况下,关闭了软件,然后再次登录后,应该要复现会话列表。因此本篇文章将实现会话列表的存储及复现逻辑。至于删除会话操作,先不做,等项目大体上全部完成,后期优化的时候再做。

首先,我们需要在所有能够产生新会话的地方进行存储。目前只有两处,一个是首次接收验证消息的时候产生的验证消息会话,一个是接收到了验证消息“同意”的反馈之后产生的用户会话。由于要做的事情是一样的,因此,我们写了一个用于存储会话列表的方法,和存储验证消息列表类似:

public void saveTalkPanelToFile(TalkMessage tm)
{//需要保存的是什么?
StreamWriter sw = new StreamWriter(talkFilePath, true);
sw.WriteLine(tm.Account + Common.splitFlag + tm.NickName+ Common.splitFlag+ tm.SubMessage + Common.splitFlag+ tm.Time);
sw.Flush();
sw.Close();
}

takFilePath是一个字段:

private string talkFilePath = "talk.db";

我们只需要在那两处地方调用即可。贴出关键代码:

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);
//将会话列表保存到文件中
saveTalkPanelToFile(tm);
//刷新会话列表界面
refreshTalkList();
//初始化好友列表
initFriendList();
}
else
{//普通验证消息
//1.会话列表出现验证消息会话
//判断界面上是否有了验证消息会话 有就修改,没有就添加
if (!Common.existedTalk.ContainsKey("验证消息"))
{
//不包含就添加到会话列表
TalkMessage tm = new TalkMessage();
tm.NickName = "验证消息";
tm.SubMessage = msgarr[0] + "请求添加你为好友";
tm.Account = "验证消息";
Panel talkpanle = loadConfirmTalk(tm);
Common.existedTalk.Add(tm.Account, talkpanle);
saveTalkPanelToFile(tm);
//刷新会话列表界面
refreshTalkList();
}
else
{
//已经存在会话列表中了,就修改上面的提示消息
Panel talkpanel = Common.existedTalk["验证消息"];
string temp = "";
foreach (Control c in talkpanel.Controls)
{
if (c is Label)
{
if (((Label)c).Name == "messageName")
{
((Label)c).Text = msgarr[0] + "请求添加你为好友";
temp = ((Label)c).Text;
}
}
}
//修改文件中的submessage列的数据
updateTalkPanleFileSubmessage(msgarr[0],temp);
//刷新会话列表界面
refreshTalkList();
}

注意这个updateTalkPanleFileSubmessage方法,它是后面优化时要用到的,先不用实现它的方法体。它主要就是保存会话列表中的提示信息的。因为每接收一个反馈或者聊天,这个提示信息都会变,它包含在会话列表上,因此,接收到消息之后就要更新会话列表文件中的这一列,但是现在不做,因为后面接收普通聊天消息时也要用到,后面再做。

目前为止,就实现了存储会话列表,然后是复现,在Major主窗体的load事件中初始化会话列表即可:

//初始化会话列表
initTalkMessageList();

private void initTalkMessageList()
{
List list = fileToList();
for (int i = 0; i < list.Count; i++)
{
Panel p = loadtalk(i, list[i]);
Common.existedTalk.Add(list[i].Account,p);
}
}

然后是fileToList方法:

private List fileToList()
{
List list = new List();
if (!File.Exists(talkFilePath))
{
return list;
}
StreamReader sr = new StreamReader(talkFilePath);
string line = "";
while ((line = sr.ReadLine()) != null)
{
string[] arr = line.Split(new string[] { Common.splitFlag }, StringSplitOptions.None);
TalkMessage tm = new TalkMessage();
tm.Account = arr[0];
tm.NickName = arr[1];
tm.SubMessage = arr[2];
tm.Time = arr[3];
list.Add(tm);
}
sr.Close();
//将元素逆序
list.Reverse();
return list;
}

注意这个将元素逆序的方法,因为刷新会话列表方法刷新的时候会将列表顺序搞错,因此这里需要这样处理。但是呢,今天做的时候它还是有点问题,放到后面做吧,至少不影响功能。

好了,本篇文章就到这里,下一篇文章开始将互发消息,其实互发消息很简单,调用Common的SendMsg方法即可,难点在于消息的接收、显示,以及如何在本地存储消息记录。关于本地存储消息记录的方案,希望读者朋友们能够提供给我一些建议。

本文系小博客网站原创,转载请注明文章链接地址

c# webclient 保存会话信息_winform项目——仿QQ即时通讯程序16:会话列表的存储相关推荐

  1. winform项目_winform项目——仿QQ即时通讯程序01:原理及项目分析

    即时通讯程序,腾讯QQ可以说是一家独大,虽然市场上仍然有类似QQ的即时通讯程序,但是基本上面向的对象都是特定人群.那么,现在做一个即时通讯的软件还有意义吗?在我看来,意义非常大.作为一个学习编程的人, ...

  2. delphi 登录界面 主窗体 切换_winform项目——仿QQ即时通讯程序06:主界面交互逻辑...

    上一篇文章,我们搭建好了主界面的布局.本文将实现页面的交互逻辑,比如如何移动窗体.调整窗体大小.点击消息和联系人切换下方的panel面板.动态加载消息列表panel和好友列表panel等,并且左下角的 ...

  3. .net winform panel 不刷新_winform项目——仿QQ即时通讯程序04:登录界面补充

    上一篇文章给出了Login登录界面的详细制作过程,目的是让初学者体验如何对窗体上的控件进行布局,过程非常详细,如果对winform布局不熟悉的同学可以详细阅读.本篇文章将继续完成Login窗体上的注册 ...

  4. winform服务器消息推送,winform项目——仿QQ即时通讯程序12:服务端程序补充及优化...

    原标题:winform项目--仿QQ即时通讯程序12:服务端程序补充及优化 上一篇文章大概完成了服务端程序,今天继续做项目的时候发现还有一些功能没有做,还有几处地方不够完善.不做好就会影响客户端程序的 ...

  5. 基于环信的仿QQ即时通讯的简单实现

    代码地址如下: http://www.demodashi.com/demo/11645.html 我的博客地址 之前一直想实现聊天的功能,但是感觉有点困难,今天看了环信的API,就利用下午的时间动手试 ...

  6. C++实现飞鸽传书仿QQ即时通讯软件!(源码打包好了!)

    FreeEIM 仿QQ功能的企业即时通讯软件VC++的源代码,最后更新于2010年8月份,完成数据库更改的任务.将聊天记录改用数据库形式,暂且使用Access. 本软件的窗口和功能都与QQ有点相似,可 ...

  7. java实现即时通信仿qq_java版仿QQ即时通讯系统

    [实例简介] 本系统使用java开发,使用myeclipse和SqlServer数据库,可以实现用户的即时通讯功能 [实例截图] [核心代码] QQ2016 └── QQ2016 ├── 360魔法摄 ...

  8. 【181029】FreeEIM 飞鸽传书仿QQ即时通讯软件VC++源代码

    FreeEIM 仿QQ功能的企业即时通讯软件VC++的源代码,最后更新于2010年8月份,完成数据库更改的任务.将聊天记录改用数据库形式,暂且使用Access. 本软件的窗口和功能都与QQ有点相似,可 ...

  9. 仿QQ即时通讯聊天软件Windows新版可定制客户端演示

    一款跨平台可定制的 P2P 即时通信聊天系统,为电子商务网站及各行业门户网站和企事业单位提供"一站式"定制解决方案,打造一个稳定,安全,高效,可扩展的即时通信系统,支持在线聊天.视 ...

最新文章

  1. Nagios系统监控软件的安装设置(4)
  2. 如何制作linux系统硬盘,教你制作Linux操作系统的Boot/Root盘
  3. 51nod 1649 齐头并进 (djikstra求最短路径,只用跑一次)
  4. solidity modifier函数修改器 智能合约开发知识浅学(三)
  5. 天池 在线编程 有效的字符串
  6. Connection对象 Statement对象 ResultSet对象
  7. 数据结构大作业_大数据课程笔记
  8. android的内存泄露有几种,Android中几种有可能会导致内存泄露的情况
  9. web.xml 中的listener、 filter、servlet 加载顺序及其详解
  10. unity 引用prefab_Unity基础教程-对象管理(二)——对象多样化(Fabricating Shapes)...
  11. pdg快速转换pdf源码_在手机上快速免费把图片转换成PDF文件
  12. 原生 js 生成二维码
  13. 禾川Q1系列PLC官方教程
  14. vivo和小米鸿蒙系统哪个好,vivo和华为还有小米,哪个系统流畅度更好?
  15. 小米手机获取root权限最常见问题
  16. 高通骁龙855发布,5G大幕拉开,新一轮手机大战在即
  17. JavaScript动态向表格添加数据
  18. 字体界的黑科技!输入数字立刻生成酷炫信息图的字体
  19. object-ui之动画雪花降落实现
  20. 2014Esri中国用户大会亮点系列之——ArcGIS产品

热门文章

  1. 【求助】Android开发中的数据持久化
  2. 教你学习CI框架codelgniter——CI框架基本配置
  3. 【论文写作】学位论文写作过程中应注意的7个问题,非常实用
  4. 计算机常见的户动方法有哪些,《360doc个人图书馆》常用操作方法
  5. JavaScript类与原型——组织JavaScript代码
  6. Android5手动root,魅蓝Note5如何获取ROOT权限?魅蓝Note5 ROOT教程(亲测可行)
  7. android studio后端写在哪里_c++写的在终端上的2048游戏
  8. 海盐商贸学校计算机类试卷,海盐县商贸学校
  9. java swagger ui 教程_java集成Swagger的步骤详解
  10. mysql故障转移,MySQL之MHA故障转移