我在开发一个聊天工具,多少用户我也不知道,反正很多.现要求服务器端要存储聊天记录.
老板一在要求效率,哪位大牛给点思路阿??

解决方案 »

  1.   

    http://topic.csdn.net/u/20080421/15/b0e4c874-7c72-481d-8a95-37c2ce1f7d89.html
     可以采用次存储过程读取数据`
      

  2.   

    一般用套接字传输信息。客户端程序:   1. 打开VS.net,新建一个C#的模板为“Windows 应用程序”的项目,不妨命名为“ChatClient”。   2. 布置界面。往界面上添加一个ListBox控件(用于显示用户列表),一个RichTextBox控件(用于显示聊天消息以及系统消息),一个TextBox控件(用于发送消息),一个CheckBox控件(确定是否为悄悄话),一个StatusBar控件以及四个Button控件(分别为“连接”、“断开连接”、“开始记录”、“发送”)。各个控件的属性设置可以参见源代码中的具体设置,这里从略。3. 客户端程序的代码编写。   当客户端试图和服务器端进行连接时,一个连接必须建立而且得向服务器端进行注册。 EstablishConnection()函数运用一个TcpClient来和服务器端取得连接,同时创建一个NetworkStream来发送消息。还有,端口号和服务器端的是保持一致的,均为5555。EstablishConnection()函数如下:private void EstablishConnection() 

    statusBar1.Text = "正在连接到服务器"; 
    try 

    clientsocket = new TcpClient(serveraddress,serverport); 
    ns = clientsocket.GetStream(); 
    sr = new StreamReader(ns); 
    connected = true; 

    catch (Exception) 

    MessageBox.Show("不能连接到服务器!","错误", 
    MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
    statusBar1.Text = "已断开连接"; 

    }   在和服务器端连接成功后,程序就用RegisterWithServer()函数向服务器端发送一个CONN命令。该命令先是发送该用户的名称,然后从服务器端获得其他所有用户的列表,所有用户列表是在ListBox控件中显示的。该函数如下: private void RegisterWithServer() 

    try 

    string command = "CONN|" + ChatOut.Text; 
    Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray()); 
    ns.Write(outbytes,0,outbytes.Length); 
    string serverresponse = sr.ReadLine(); 
    serverresponse.Trim(); 
    string[] tokens = serverresponse.Split(new Char[]{'|'}); 
    if(tokens[0] == "LIST") 

    statusBar1.Text = "已连接"; 
    btnDisconnect.Enabled = true; 

    for(int n=1; n
    lbChatters.Items.Add(tokens[n].Trim(new char[]{'\r','\n'})); 
    this.Text = clientname + ":已连接到服务器"; 

    catch (Exception) 

    MessageBox.Show("注册时发生错误!","错误", 
    MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 


    在此之后,当然就是用户之间的聊天了,由ReceiveChat()函数来完成。该函数是一个独立的线程,它处理所有用户获得的消息和用户发送的消息。它主要处理了CHAT、PRIV、JOIN、GONE、QUIT等命令,处理的方法和服务器端的类似。具体函数实现如下: private void ReceiveChat() 

    bool keepalive = true; 
    while (keepalive) 

    try 

    Byte[] buffer = new Byte[2048]; 
    ns.Read(buffer,0,buffer.Length); 
    string chatter = System.Text.Encoding.ASCII.GetString(buffer); 
    string[] tokens = chatter.Split(new Char[]{'|'}); if (tokens[0] == "CHAT") 

    rtbChatIn.AppendText(tokens[1]); 
    if(logging) 
    logwriter.WriteLine(tokens[1]); 

    if (tokens[0] == "PRIV") 

    rtbChatIn.AppendText("Private from "); 
    rtbChatIn.AppendText(tokens[1].Trim() ); 
    rtbChatIn.AppendText(tokens[2] + "\r\n"); 
    if(logging) 

    logwriter.Write("Private from "); 
    logwriter.Write(tokens[1].Trim() ); 
    logwriter.WriteLine(tokens[2] + "\r\n"); 


    if (tokens[0] == "JOIN") 

    rtbChatIn.AppendText(tokens[1].Trim() ); 
    rtbChatIn.AppendText(" has joined the Chat\r\n"); 
    if(logging) 

    logwriter.WriteLine(tokens[1]+" has joined the Chat"); 

    string newguy = tokens[1].Trim(new char[]{'\r','\n'}); 
    lbChatters.Items.Add(newguy); 

    if (tokens[0] == "GONE") 

    rtbChatIn.AppendText(tokens[1].Trim() ); 
    rtbChatIn.AppendText(" has left the Chat\r\n"); 
    if(logging) 

    logwriter.WriteLine(tokens[1]+" has left the Chat"); 

    lbChatters.Items.Remove(tokens[1].Trim(new char[]{'\r','\n'})); 

    if (tokens[0] == "QUIT") 

    ns.Close(); 
    clientsocket.Close(); 
    keepalive = false; 
    statusBar1.Text = "服务器端已停止"; 
    connected= false; 
    btnSend.Enabled = false; 
    btnDisconnect.Enabled = false; 


    catch(Exception){} 

    }   通过以上的一些函数,客户端程序之间就可以进行自由地聊天了,各个用户之间还可以互相发送悄悄话。所以程序已经实现了聊天室的基本功能了,不过最后各个用户还要正常地退出,那就要用到QuitChat()函数了。该函数的具体实现如下: private void QuitChat() 

    if(connected) 

    try 

    string command = "GONE|" + clientname; 
    Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray()); 
    ns.Write(outbytes,0,outbytes.Length); 
    clientsocket.Close(); 

    catch(Exception) 



    if(logging) 
    logwriter.Close(); 
    if(receive != null && receive.IsAlive) 
    receive.Abort(); 
    this.Text = "客户端"; 
      

  3.   

    存在xml等硬盘文件一般数据量都不是很大的情况
      

  4.   

    把聊天记录存在内存的DataTable中,每满一万条或者一段时间的时候序列化存盘(关键是释放内存)。客户端要查看聊天记录的话把序列化的文件下载至本地.....可行吗?-------------------------------------------------------存数据库的话是每接收到一条就入库?还是内存中凑满N条一起入库?或者别的?请指教~~~谢谢
      

  5.   

    一定要用数据库吧,要不查询还不累死?写入SQL,发一条写一条呗!
      

  6.   

    安装日期或时间段保存数据到XML
    数据库也可保存,设置索引
    建设相应的缓存机制
    http://topic.csdn.net/u/20090523/16/9E891FDA-72DC-4417-B554-22EDFDE7E437.html
      

  7.   

    是啊,如果能按照QQ的方式就简单了
    如果QQ也把聊天记录存在服务器,那我估计他们也会很头疼的
      

  8.   

    写在配置文件里,把数据存起指定文件位置,接着读取配置文件里的信息,比如你的数据存在 e:\\xxx.txt,然后通过配置文件读取获取保存。
      

  9.   

    使用临时表。
    所有记录存在临时表中,然后计划任务,每多条时间将临时表数据用DTS传给正式表一次,频率可根据数据产生的量来决定。如果非常大,主表建分区表,索引要用,统计也要用,应该会快很多。
      

  10.   

    不知道楼主的海量是多大量,可以参考Google的BigTable的设计思想,相信对你有很大帮助,Google的数据应该可以称为海量吧
      

  11.   

    聊天用socket传消息。数据库用存储过程速度快。
      

  12.   

        楼主你可以看下你这个帖子下面的相关问题里的链接,都是类似的问题,类似QQ的聊天工具数据量都很大的,你要频繁查询和更新聊天记录,而且还是小成本高效率是比较难搞啊,要不你这样好了,先搞成像QQ一样,本地保存,只有付费的高级用户才有保存在服务器上的权限,这样做起来以后,用户多了,再加上广告还有其他商业活动多了,有¥了再考虑分布式应用好了。
      

  13.   

    谢谢
    BOSS最终放弃了这个功能,呵呵
      

  14.   

    你用SQl Server等数据库,把表设计好,并设计好索引,问题不大!
    历史聊天记录,可设计另一组表来存放,减轻单表负荷!
    ----------
    三易通软件(三易通服装进销存,三易通服装进销存软件,三易通服装进销存管理软件,三易通服装进销存管理系统,三易通服装店软件,三易通服装店管理软件,三易通服装店管理系统,三易通服装销售软件,三易通服装管理软件,三易通服装销售管理软件,三易通服装销售管理系统,三易通服装零售管理软件,三易通服装零售管理系统,三易通服装店收银软件)http://www.3etsoft.cn