标题:新手请教,怎么实时保存聊天记录并调用文本框显示?
只看楼主
smart0721
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:106
专家分:468
注 册:2012-2-10
结帖率:100%
已结贴  问题点数:20 回复次数:6 
新手请教,怎么实时保存聊天记录并调用文本框显示?

我想要像腾讯QQ在聊天的时候实时把聊天记录(信息不重复)保存起来,在需要查看的时候,单击聊天记录按钮就可以在右边文本框中显示保存的聊天记录(希望能查看到每次聊天的记录)!
请问大家,要怎么实现?
程序代码:
 private void button_Send_Click(object sender, EventArgs e)
        {
            IPAddress ip = IPAddress.Parse(Publec_Class.ServerIP);//服务器端的IP地址
            string port = Publec_Class.ServerPort;//端口号
            string revid = ((this.Tag as TreeNode).Tag as ClassUserInfo).UserID;//接收ID号
            string sid = Publec_Class.UserID;//发送ID
            string msgid = Guid.NewGuid().ToString();//设置全局惟一标识

            byte[] data = Encoding.Unicode.GetBytes(rich_Input.Rtf);//将当前要发送的信息转换成二进制流
            ClassMsg msg = new ClassMsg();
            msg.sendKind = SendKind.SendMsg;//发送的消息
            msg.msgCommand = MsgCommand.SendToOne;//发送的是单用户信息
            msg.SID = sid;//发送ID
            msg.RID = revid;//接收ID
            msg.Data = data;//发送的信息
            msg.msgID = msgid;

            if (data.Length <= 1024)//如果发送信息的长度小于等于1024
            {
                msg.sendState = SendState.Single;
                //将信息直接发送给远程客户端
                udpsocket.Send(ip, Convert.ToInt32(port), new ClassSerializers().SerializeBinary(msg).ToArray());
            }
            else
            {
                ClassMsg start = new ClassMsg();
                start.sendKind = SendKind.SendMsg;
                start.sendState = SendState.Start;//文件发送开始命令
                start.msgCommand = MsgCommand.SendToOne;//发送单用户命令
                start.SID = sid;
                start.RID = revid;
                start.Data = Encoding.Unicode.GetBytes("");
                start.msgID = msgid;
                udpsocket.Send(ip, Convert.ToInt32(port), new ClassSerializers().SerializeBinary(start).ToArray());
                MemoryStream stream = new MemoryStream(data);//将二进制流存储到内存流中
                int sendlen = 1024; //设置文件每块发送的长度
                long sunlen = (stream.Length);//整个文件的大小
                int offset = 0;//设置文件发送的起始位置
                while (sunlen > 0)  //分流发送
                {
                    sendlen = 1024;
                    if (sunlen <= sendlen)
                        sendlen = Convert.ToInt32(sunlen);
                    byte[] msgdata = new byte[sendlen];
                    stream.Read(msgdata, offset, sendlen);//读取要发送的字节块
                    msg.sendState = SendState.Sending;//发送状态为文件发送中
                    msg.Data = msgdata;
                    udpsocket.Send(ip, Convert.ToInt32(port), new ClassSerializers().SerializeBinary(msg).ToArray());//发送当前块的信息
                    sunlen = sunlen - sendlen;//记录下一块的起始位置
                }
                ClassMsg end = new ClassMsg();
                end.sendKind = SendKind.SendMsg;
                end.sendState = SendState.End;//文件发送结束命令
                end.msgCommand = MsgCommand.SendToOne;
                end.SID = sid;
                end.RID = revid;
                end.Data = Encoding.Unicode.GetBytes("");
                end.msgID = msgid;
                udpsocket.Send(ip, Convert.ToInt32(port), new ClassSerializers().SerializeBinary(end).ToArray());//发送信息,通知文件发送结束

                string dir = System.Environment.CurrentDirectory;
                dir = dir.Substring(0, dir.Length - 9);
                pictureBox1.Load(dir + @"Image\QQ12.jpg");
            }

            Rich_Out.SelectionStart = 0;//将文本的起始点设为0
            Rich_Out.AppendText(Publec_Class.UserName);//将当前用户名添加到文本框中
            Rich_Out.AppendText("  "+ DateTime.Now.ToString());//将当前发送的时间添加到文本框中
            Rich_Out.AppendText("\r\n");//换行回车
            Rich_Out.SelectedRtf = rich_Input.Rtf;//将发送信息添加到接收文本框中
            rich_Input.Clear();//清空发送文本框
        }
这是我发送消息模块。
搜索更多相关主题的帖子: 聊天 记录 腾讯QQ 文本框 color 
2012-02-13 11:21
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
得分:10 
可以把聊天记录封装成类,再通过序列化与反序列化保存和读取,比如可以这样写(没测试)
程序代码:
public class ChatLog
    {
        public ChatLog()
        {
        }
        private string chat;
        private string name;
        private DateTime theTime;
        public string Chat
        {
            get { return chat; }
            set { chat = value; }
        }
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public DateTime TheTime
        {
            get { return theTime; }
            set { theTime = value; }
        }
    }
    public class ChatLogDbHelper
    {
        public bool Save(string savePath, List<ChatLog> cllist)
        {
            try
            {
                FileStream fs = new FileStream(savePath + "ChatLog.dat", FileMode.Create);
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(fs, cllist);
                fs.Close();
                return true;
            }
            catch
            {
                return false;
            }
        }

        public List<ChatLog> Read(string logPath)
        {
            try
            {
                List<ChatLog> cllist = new List<ChatLog>();
                FileStream fs = new FileStream(logPath + "ChatLog.dat", FileMode.Open);
                BinaryFormatter formatter = new BinaryFormatter();
                if (fs.Length > 0)
                {
                    cllist = (List<ChatLog>)formatter.Deserialize(fs);
                }
                fs.Close();
                return cllist;
            }
            catch
            {
                return null;
            }
        }
    }


站在春哥的肩膀上
2012-02-14 10:02
smart0721
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:106
专家分:468
注 册:2012-2-10
得分:0 
谢谢楼上的解答!不过我还有些问题还弄不明白,封装之后要怎样通过实例化调用?在接收到信息后分别把ChatLog类中的三个对象实例化写入ChatLog.dat?
还有要通过什么事件来调用?用Timer_Clik?还用通过判断信息发送状态或者接收状态来调用,还是通过信息接收文本框的TextChange事件来调用?望能再赐教!!感激不尽……
PS:有个小问题,我把上面的封装成ChatLog类后,却调用不了!出现这样的错误:错误    未能找到类型或命名空间名称“ChatLog”(是否缺少 using 指令或程序集引用?)    请教这是什么问题?(其他同在QQClass项目里的类都可以调用)
2012-02-14 11:56
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
得分:5 
要一个容器 List<ChatLog> log=new List<ChatLog>装所有的聊天记录
在接收或发送一条数据时
ChatLog cl=new ChatLog();
cl.Chat=...
cl.Name=...
cl.TheTime=...
log.Add(cl);

站在春哥的肩膀上
2012-02-14 12:03
smart0721
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:106
专家分:468
注 册:2012-2-10
得分:0 
哦,这个我知道!最后一个问题,怎么通过按钮触发事件,把所有的聊天记录在一个文本框中显示出来呢?
2012-02-14 14:27
xydddaxia
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:33
帖 子:466
专家分:2307
注 册:2009-3-20
得分:5 
所有的聊天记录都应该放在一个容器里面,只是读取的时候按聊天对象筛选

站在春哥的肩膀上
2012-02-14 14:42
smart0721
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:106
专家分:468
注 册:2012-2-10
得分:0 
哦,我明白了!谢谢!
2012-02-14 14:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360813-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.096922 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved