winform做OA,在集团内部一对一聊天、传送文件和多对多聊天(群聊天),聊天记录要保存到数据库,应该是个什么样的开发思路,或者有没有简单点能看懂的例子

解决方案 »

  1.   

    我有例子,不过是用remoting做的,不过现在好像出问题了得调试一下才行的~!微软有关于这的一个视频的。
      

  2.   

    sockets类啊!
    给你点代码吧:
    传文件就用文件流来操作。using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net.Sockets;
    using System.Net;
    using System.Data.SqlClient;
    using System.Threading;namespace NGN
    {    class Program
        {
            private IPAddress hostIPAddress = IPAddress.Parse("127.0.0.1");
            private IPEndPoint Server;
            private Socket listeningSocket;
            private Socket mySocket;
            //private string receivedata="";
            /***********************
             *****定义const常量*****
             ***********************/
            //无事件
            private const int Event_None = 0;
            //insert告警
            private const int Event_DataInsert = 1;
            //update告警
            private const int Event_DataUpdate = 2;
            [STAThread]        /// <summary>
            /// 发送数据
            /// </summary>
            public void SendData()
            {
                Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint client = new IPEndPoint(hostIPAddress, 1122);
                //sendSocket.Connect();
            }
            /// <summary>
            /// 端口监听
            /// </summary>
            public void ReceiveData()
            {
                try
                {
                    //创建接收数据的Socket
                    listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    //设置接收数据的地址
                    Server = new IPEndPoint(hostIPAddress, 1122);
                    //绑定主机端口
                    listeningSocket.Bind(Server);
                    //监听端口,设置队列数为50
                    listeningSocket.Listen(50);
                    System.Console.WriteLine("主机正在监听……");
                    //以同步方式从侦听,并返回第一个挂起的连接请求
                    //while (true)
                    //if (listeningSocket.Connected)
                    {
                        mySocket = listeningSocket.Accept();
                        Thread thread = new Thread(new ThreadStart(ThreadProc));
                        thread.Start();
                    }
                }
                catch (Exception e)
                {
                    System.Console.Write(e.Message);
                }
            }
            /// <summary>
            /// 获得拨号动态分配IP地址
            /// </summary>
            /// <returns></returns>
            private static string getIPAddress()
            {
                
                IPAddress addr = new IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);
                return addr.ToString();
            }
            /// <summary>
            /// 数据接收
            /// </summary>
            public void ThreadProc()
            {
                try
                {
                    //while (true)
                    {
                        //if (mySocket.Poll(1, SelectMode.SelectRead))
                        //if (listeningSocket.Connected)
                        {
                            //mySocket = listeningSocket.Accept();
                            if (mySocket != null && mySocket.Connected)
                            {
                                string ClientIP = getIPAddress();
                                System.Console.WriteLine("客户机:" + ClientIP + "连接上主机!" + "                   " + DateTime.Now);
                                //this.label5.Text = "与客户建立连接";
                                int i = 1;
                                while (true)
                                {
                                    //设置接收数据缓冲区的大小
                                    Byte[] recData = new Byte[512];
                                    mySocket.Receive(recData);
                                    int len = recData.Length;
                                    //string ReceiveString = Encoding.GetEncoding("ASCII").GetString(recData);
                                    //string ReceiveString = Encoding.GetEncoding(936).GetString(recData);
                                    //ReceiveString = Encoding.GetEncoding("gb2312").GetString(recData);
                                    string ReceiveString = Encoding.GetEncoding("UTF-8").GetString(recData);
                                    //string abc = ReceiveString.Substring(0, ReceiveString.LastIndexOf('n')+1);
                                    System.Console.WriteLine("收到客户机:" + ClientIP + "信息:" + ReceiveString.Substring(0, ReceiveString.LastIndexOf('n')+1));
                                    System.Console.WriteLine("");
                                    //receivedata = Encoding.ASCII.GetString(recData);
                                    if (ReceiveString != "")
                                    {
                                        string sendstr = "这是接收到的第" + i + "条信息";
                                        i++;
                                        byte[] bs = Encoding.GetEncoding("utf-8").GetBytes(sendstr);
                                        mySocket.Send(bs, bs.Length, 0);
                                        ReceiveDo(ReceiveString);
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    System.Console.Write(e.Message);
                }
            }
            /************************
             *******监听停止*********
             ************************/
            //public void StopListen()
            //{
            //    try
            //    {
            //        listeningSocket.Close();
            //        label5.Text = "主机停止了监听";
            //    }
            //    catch
            //    {
            //        MessageBox.Show("监听尚未开始");
            //    }
            //}
            /// <summary>
            /// 划分字段
            /// </summary>
            /// <param name="ReceiveString">接收到的字符串</param>
            /// <returns></returns>
            public string[] ExecuteData(string ReceiveString)
            {
                int start = ReceiveString.IndexOf(':', 0);
                int end = ReceiveString.LastIndexOf('n');
                string DataString = ReceiveString.Substring(start + 1, end - start - 4);
                string[] CurrentList = DataString.Split('|');
                return CurrentList;
            }
            /// <summary>
            /// 判断事件
            /// </summary>
            /// <param name="EventString">含有insert或update的字符串</param>
            /// <returns></returns>
            public int GetEvent(string EventString)
            {
                if (EventString.Contains("insert"))
                    return Event_DataInsert;
                else if (EventString.Contains("update"))
                    return Event_DataUpdate;
                else
                    return Event_None;
            }
            
      

  3.   


    /// <summary>
            /// 设置SQL语句
            /// </summary>
            /// <param name="Event">执行SQL的方法</param>
            /// <param name="DataList">获得字段的数据列表</param>
            /// <returns></returns>
            public string SetSql(int Event, string[] DataList)
            {
                StringBuilder SqlBuilder = new StringBuilder();
                switch (Event)
                {
                    case Event_DataInsert:
                        SqlBuilder.Append("insert into NGNSever (Domain1,SubDomain,EMSName,Node,NodeAlias,Severity,AlertName,AlertType,AlertSourceType,AlertInfo2,AlertInfo4,Acknowledged,AcknowledgedTime,FirstNMSTime,LastNMSTime,Summary) values (");
                        SqlBuilder.Append("" + DataList[0] + ",");//Domain
                        SqlBuilder.Append(DataList[1] + ",");//SubDomain
                        SqlBuilder.Append("'" + DataList[2] + "',");//EMSName
                        SqlBuilder.Append("'" + DataList[3] + "',");//Node
                        SqlBuilder.Append("'" + DataList[4] + "',");//NodeAlias
                        SqlBuilder.Append("" + DataList[5] + ",");//Severity
                        SqlBuilder.Append("'" + DataList[6] + "',");//AlertName
                        SqlBuilder.Append("'" + DataList[7] + "',");//AlertType
                        SqlBuilder.Append("'" + DataList[8] + "',");//AlertSourceType
                        SqlBuilder.Append("'" + DataList[9] + "',");//AlertInfo2
                        SqlBuilder.Append("'" + DataList[10] + "',");//AlertInfo4
                        SqlBuilder.Append("'" + DataList[11] + "',");//Acknowledged
                        SqlBuilder.Append("'" + Convert.ToDateTime(DataList[12]) + "',");//AcknowledgedTime
                        SqlBuilder.Append("'" + Convert.ToDateTime(DataList[13]) + "',");//FirstNMSTime
                        SqlBuilder.Append("'" + Convert.ToDateTime(DataList[14]) + "',");//LastNMSTime
                        SqlBuilder.Append("'" + DataList[15] + "'"); //Summary
                        SqlBuilder.Append(")");
                        break;
                    case Event_DataUpdate:
                        SqlBuilder.Append("update NGNSever set ");
                        SqlBuilder.Append("Domain1=" + DataList[1] + ",");//Domain
                        SqlBuilder.Append("SubDomain=" + DataList[2] + ",");//SubDomain
                        SqlBuilder.Append("EMSName='" + DataList[3] + "',");//EMSName
                        SqlBuilder.Append("Node='" + DataList[4] + "',");//Node
                        SqlBuilder.Append("NodeAlias='" + DataList[5] + "',");//NodeAlias
                        SqlBuilder.Append("Severity='" + DataList[6] + "',");//Severity
                        SqlBuilder.Append("AlertName='" + DataList[7] + "',");//AlertName
                        SqlBuilder.Append("AlertType='" + DataList[8] + "',");//AlertType
                        SqlBuilder.Append("AlertSourceType='" + DataList[9] + "',");//AlertSourceType
                        SqlBuilder.Append("AlertInfo2='" + DataList[10] + "',");//AlertInfo2
                        SqlBuilder.Append("AlertInfo4='" + DataList[11] + "',");//AlertInfo4
                        SqlBuilder.Append("Acknowledged='" + DataList[12] + "',");//Acknowledged
                        SqlBuilder.Append("AcknowledgedTime='" + Convert.ToDateTime(DataList[13]) + "',");//AcknowledgedTime
                        SqlBuilder.Append("FirstNMSTime='" + Convert.ToDateTime(DataList[14]) + "',");//FirstNMSTime
                        SqlBuilder.Append("LastNMSTime='" + Convert.ToDateTime(DataList[15]) + "',");//LastNMSTime
                        SqlBuilder.Append("Summary='" + DataList[16] + "'");//Summary
                        SqlBuilder.Append("where identifier=" + DataList[0]);
                        break;
                    default:
                        break;            }
                string Sql = SqlBuilder.ToString();
                //MessageBox.Show(Sql);
                return Sql;
            }
            /// <summary>
            /// 数据处理
            /// </summary>
            /// <param name="sql"></param>
            public void DataHandle(string sql)
            {
                try
                {
                    SqlConnection conn1 = new SqlConnection("user id=sa;database=.;initial catalog=NGN;");
                    SqlCommand cmd = new SqlCommand(sql, conn1);
                    conn1.Open();
                    cmd.ExecuteNonQuery();
                    conn1.Close();
                }
                catch (Exception e)
                {
                    System.Console.Write(e.Message);
                }
            }
            /// <summary>
            /// 综合处理
            /// </summary>
            /// <param name="DataString"></param>
            public void ReceiveDo(string DataString)
            {
                //textBox3.Text=DataString;
                string[] DataList = ExecuteData(DataString);
                //foreach (string data in DataList)
                //{
                //    textBox3.AppendText(data + "\r\n");
                //}
                int Event = GetEvent(DataString);
                string Sql = SetSql(Event, DataList);
                DataHandle(Sql);
            }
            static void Main(string[] args)
            {
                Program pro = new Program();
                pro.ReceiveData();
            }
        }
    }
      

  4.   

    那个用socket的也行的!~正规做法!~
      

  5.   

    可以用开源的通信协议!!XMPP协议!!
      

  6.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using System.Data.SqlClient;namespace NGN_Client
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Control.CheckForIllegalCrossThreadCalls = false;
            }
            private IPAddress hostIPAddress = IPAddress.Parse("127.0.0.1");
            private Socket sendSocket;
            /// <summary>
            /// 请求连接      
            /// </summary>
            public void RequestConnection()
            {
                try
                {
                    //创建发送数据的Socket
                    sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    //设置发送数据的地址
                    IPEndPoint Server = new IPEndPoint(hostIPAddress, 1122);
                    //创建连接
                    sendSocket.Connect(Server);
                    //if (sendSocket.Connected)
                    {
                        this.label5.Text = "连接成功";
                        //Thread thread = new Thread(new ThreadStart(ThreadProc));
                        //thread.Start();
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }        }
            public void ThreadProc()
            {
                try
                {
                    while (true)
                    {
                        //设置接收数据缓冲区的大小
                        Byte[] recData = new Byte[128];
                        sendSocket.Receive(recData);
                        string DataString = Encoding.GetEncoding("utf-8").GetString(recData);
                        this.textBox3.AppendText(DataString+"\r\n");
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
            public void SendData()
            {
                try
                {
                    string SendString = this.textBox4.Text;
                    Byte[] ByteSend = Encoding.GetEncoding("UTF-8").GetBytes(SendString);
                    //ByteSend = Encoding.GetEncoding("ASCII").GetBytes(SendString);
                    //ByteSend = Encoding.GetEncoding("gb2312").GetBytes(SendString);
                    
                    sendSocket.Send(ByteSend, ByteSend.Length, 0);
                }
                catch
                {
                    MessageBox.Show("连接尚未建立");
                }
            }     
            /// <summary>
            ///    关闭连接
            /// </summary>
            public void CloseConnection()
            {
                try
                {
                    sendSocket.Close();
                    this.label5.Text = "关闭连接";
                }
                catch
                {
                    MessageBox.Show("连接尚未建立");
                }
            }
            public void GetSQLData()
            {        }        private void button1_Click(object sender, EventArgs e)
            {
                RequestConnection();
            }        private void button2_Click(object sender, EventArgs e)
            {
                CloseConnection();
            }        private void button3_Click(object sender, EventArgs e)
            {
                SendData();
            }
        }
    }