现在有一个winform程序,有很多个winform客户端,服务端也有一个winform,是用来用来记录和监视客户端之间的通讯。现在有个问题是,winform客户端出现异常的时候,会拖死服务端的winform监视程序。有什么办法当winform客户端出现异常的时候,不会拖死服务端winform监视程序。大家多多帮忙,晒晒思路代码都行,这个问题解决在追加分

解决方案 »

  1.   

    try
    {
       客户端逻辑
    }
    cache(exception e)
    {
      给server发送该客户端异常信息
      断掉和server端的连接
    }
    finnaly
    {
       释放非托管资源
    }
      

  2.   

    怎么通信? 
    客户端通信-->记录通信信息-->传给服务器-->服务器进行监听-->当客户端出现问题不发送或发送错误的信息 给服务器(是这里出现问题吗?)-->服务器接受不到信息,或超时,或接受错误处理出现问题-->服务器出现死机无响应。。
    还是多线程出现问题?
      

  3.   

    恩,是的,是把服务端的winform程序拖死,程序崩溃退出了
      

  4.   

    是把服务端的winform程序拖死了,自动崩溃退出
      

  5.   

    你这是拖死也太抽象了,是程序异常关闭了,还是程序错误,导致主机的cpu和内存都被占用了
      

  6.   

    服务端在接收发送的地方加上 try catch 处理异常
      

  7.   

    一下是服务端winform代码   大家帮忙看下using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;namespace SocketServer
    {
        using System.Net.Sockets;
        using System.Net;    /// <summary>
        /// Summary description for Client.
        /// </summary>
        public class Client
        {
            private Thread clthread;
            private EndPoint endpoint;
            private string name;
            private Socket sock;                public Client(string _name, EndPoint _endpoint, Thread _thread, Socket _sock)
            {
                //port = Convert.ToInt32(_port);
                clthread = _thread;
                endpoint = _endpoint;
                name = _name;
                sock = _sock;
            }
            public override string ToString()
            {
                return endpoint.ToString() + " : " + name;
            }        public Thread CLThread
            {
                get { return clthread; }
                set { clthread = value; }
            }
            public EndPoint Host
            {
                get { return endpoint; }
                set { endpoint = value; }
            }
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            public Socket Sock
            {
                get { return sock; }
                set { sock = value; }
            }    }
    }
      

  8.   

     public MainForm()
            {
                InitializeComponent();            //处理UI线程异常
                Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                //处理非UI线程异常
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);                      
            }
            void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                try
                {
                    AppendMessage(DateTime.Now, "", "System", "Exception:" + (e.ExceptionObject as Exception).Message);
                }
                catch 
                {
                }
            }        void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
            {
                try
                {
                    AppendMessage(DateTime.Now, "", "System", "Exception:" + e.Exception.Message.ToString());
                }
                catch { }
            }
            private void MainForm_Load(object sender, EventArgs e)
            {
                MainDataSet.Tables.Add();
                MainDataSet.Tables[0].Columns.Add("Time");
                MainDataSet.Tables[0].Columns.Add("IP");
                MainDataSet.Tables[0].Columns.Add("Type");
                MainDataSet.Tables[0].Columns.Add("Message");
                MessageViewer.DataSource = MainDataSet.Tables[0];            DataSet URLDS = new DataSet();
                URLDS.ReadXml("ConnectURL.xml");
                URLStr = URLDS.Tables[0].Rows[0]["URL"].ToString();
                URLBox.Text = URLStr;            GlbAgent = new DataAccessAgent.DataAccessAgent();
                GlbAgent.OpenStmt(URLStr, "select * from MW_APP.mwt_ud_dd_server t");
               // GlbAgent.ExecuteStmt(URLStr, string.Format("Insert Into MW_APP.MWT_UD_DD_CURUSERLIST (UserNAME) values ('{0}')", "000"));
               // GlbAgent = new DataAccessAgent.DataAccessAgent();
                //由于第一次连接延迟较长,所以在开始时执行第一条SQL;
               // URLDS = GlbAgent.OpenStmt(URLStr,"Select Sysdate From Dual");            AppendMessage(DateTime.Now, "", "System", "系统启动");           // InitializeComponent();
                clients = new ArrayList();
                processor = new Thread(new ThreadStart(StartListening));
                processor.Start();        }
      

  9.   

    这些都没用,要 StartListening 这个方法的代码
      

  10.   


    private void ServiceClient()
    {
         Socket client = clientsocket;
         bool keepalive = true;
         Client c;
         while (keepalive)
           {
            Byte[] buffer = new Byte[1024];
              try
               {
                  client.Receive(buffer);
               }
                catch (Exception e) { AppendMessage(DateTime.Now, "", "System", "Exception:" + e.Message.ToString()); }
                string clientcommand = System.Text.Encoding.Default.GetString(buffer);
                string[] tokens = clientcommand.Split(new Char[] { '|' });
                if (tokens[0] == "CONN")
                {
                   for (int n = 0; n < clients.Count; n++)
                    {
                       Client cl = (Client)clients[n];
                       SendToClient(cl, "JOIN|" + tokens[1]);
                    }
                    EndPoint ep = client.RemoteEndPoint;
                    c = new Client(tokens[1], ep, clientservice, client);
                    clients.Add(c);
                    charterList.Add(tokens[1]);
                    string message = "LIST|" + GetChatterList() + "\r\n";
                    SendToClient(c, message);
                    }
                    if (tokens[0] == "CHAT")
                    {
                        for (int n = 0; n < clients.Count; n++)
                        {
                            Client cl = (Client)clients[n];
                            SendToClient(cl, clientcommand);
                            EndPoint ep = client.RemoteEndPoint;
                            c = new Client(tokens[1], ep, clientservice, client);
                            if (cl.Host.ToString() == c.Host.ToString())
                            {
                             AppendMessage(DateTime.Now, cl.Host.ToString(), "ClientSend", c.Name.Remove(0, c.Name.IndexOf(":") + 2));
                            }
                            else
                            {
                            AppendMessage(DateTime.Now, cl.Host.ToString(), "SendToClient", c.Name.Remove(0, c.Name.IndexOf(":") + 2));
                            }
                        }
                    }
                    if (tokens[0] == "Broadcast")
                    {
                     string broadcastString = clientcommand.Replace(tokens[0] + "|", "").Replace(tokens[1] + "|", "");
                     for (int n = 0; n < clients.Count; n++)
                     {
                         Client cl = (Client)clients[n];
                         SendToClient(cl, broadcastString);
                     }
                     EndPoint ep = client.RemoteEndPoint;
                     c = new Client(tokens[1], ep, clientservice, client);
                     AppendMessage(DateTime.Now, c.Host.ToString(), "Broadcast", broadcastString);
                    }
                    if (tokens[0] == "PRIV")
                    {
                        if (tokens[2].CompareTo("GetUserList") == 0)
                        {
                      string _message = "";
                      for (int n = 0; n < clients.Count; n++)
                      {
                       Client cl = (Client)clients[n];                            
                        if (cl.Name.CompareTo(tokens[1]) == 0)
                           {
                              for (int j = 0; j < clients.Count; j++)
                                {
                                 String _tmpname = ((Client)clients[j]).Name.ToString();
                                   if (_tmpname.Contains("\0"))
                                     {
                                        _tmpname = _tmpname.Remove(_tmpname.IndexOf("\0"));
                                      }
                                     try
                                     {
                                            GlbAgent.ExecuteStmt(URLStr, string.Format("Insert Into MW_APP.MWT_UD_DD_CURUSERLIST (UserNAME) values ('{0}')", _tmpname));
                                        }
                                        catch (Exception e) { AppendMessage(DateTime.Now, "", "System", "Exception:" + e.Message.ToString()); }
                                    }
                                    _message = "PRIV|USERLIST|GetUser";
                                    SendToClient(cl, _message);
                                    AppendMessage(DateTime.Now, cl.Host.ToString(), "RecivePrivate", tokens[2].ToString());
                                    AppendMessage(DateTime.Now, cl.Host.ToString(), "SendPrivate", _message);
                                }                 
                            }
                        }
                        if (tokens[2].CompareTo("Requeste") == 0)                    
                        {
                            for (int n = 0; n < clients.Count; n++)
                            {
                                Client cl = (Client)clients[n];
                                if (cl.Name.CompareTo(tokens[3]) == 0)
                                {
     SendToClient(cl, clientcommand);
     AppendMessage(DateTime.Now, cl.Host.ToString(), "RecivePrivate", tokens[2].ToString());
      AppendMessage(DateTime.Now, cl.Host.ToString(), "SendPrivate", clientcommand);
                                }
                            }
                        }
                        if (tokens[2].CompareTo("Answer") == 0)
                        {
                            for (int n = 0; n < clients.Count; n++)
                            {
                                Client cl = (Client)clients[n];
                                if (cl.Name.CompareTo(tokens[3]) == 0)
                                {
      SendToClient(cl, clientcommand);
      AppendMessage(DateTime.Now, cl.Host.ToString(), "RecivePrivate", tokens[2].ToString());
       AppendMessage(DateTime.Now, cl.Host.ToString(), "SendPrivate", clientcommand);
                                }
                            }
                        }
                        if (tokens[2].CompareTo("RefreshAll") == 0)
                        {
                            for (int n = 0; n < clients.Count; n++)
                            {
                                Client cl = (Client)clients[n];
                                if (!(cl.Name.CompareTo(tokens[1]) == 0))
                                {
     SendToClient(cl, clientcommand);
       AppendMessage(DateTime.Now, cl.Host.ToString(), "RecivePrivate", tokens[2].ToString());
       AppendMessage(DateTime.Now, cl.Host.ToString(), "SendPrivate", clientcommand);
                                }
                            }
                        }
                        if (tokens[2].CompareTo("Refresh") == 0)
                        {
                            for (int n = 0; n < clients.Count; n++)
                            {
        Client cl = (Client)clients[n];
                                if (cl.Name.CompareTo(tokens[1]) != 0 && cl.Name.CompareTo(tokens[3]) != 0)
                                {
       SendToClient(cl, clientcommand);
       AppendMessage(DateTime.Now, cl.Host.ToString(), "RecivePrivate", tokens[2].ToString());
      AppendMessage(DateTime.Now, cl.Host.ToString(), "SendPrivate", clientcommand);
                                }
                            }
                        }
                        if (tokens[2].CompareTo("RefreshList") == 0)
                        {
                            for (int n = 0; n < clients.Count; n++)
                            {
                                Client cl = (Client)clients[n];
                                if (!(cl.Name.CompareTo(tokens[1]) == 0))
                                {
      SendToClient(cl, clientcommand);
       AppendMessage(DateTime.Now, cl.Host.ToString(), "RecivePrivate", tokens[2].ToString());
        AppendMessage(DateTime.Now, cl.Host.ToString(), "SendPrivate", clientcommand);
                                }
                            }
                        }
                        if (tokens[2].CompareTo("Close") == 0)
                        {
                            for (int n = 0; n < clients.Count; n++)
                            {
                                Client cl = (Client)clients[n];
                                if (!(cl.Name.CompareTo(tokens[1]) == 0))
                                {
                                    SendToClient(cl, clientcommand);
                                    AppendMessage(DateTime.Now, cl.Host.ToString(), "RecivePrivate", tokens[2].ToString());
                                    AppendMessage(DateTime.Now, cl.Host.ToString(), "SendPrivate", clientcommand);
                                }
                            }
                        }                 
                    }
                    if (tokens[0] == "ChangeShift")
                    {
                        for (int n = 0; n < clients.Count; n++)
                        {
                            Client cl = (Client)clients[n];
                            SendToClient(cl, "ChangeShift|");
                        }
                        AppendMessage(DateTime.Now, "", "SendAll", "ChangeShift|");
                    }
                    if (tokens[0] == "GONE")
                    {
                        int remove = 0;
                        bool found = false;
                        int count = clients.Count;
                        for (int n = 0; n < count; n++)
                        {
                            Client cl = (Client)clients[n];
                            SendToClient(cl, clientcommand);
                            if (cl.Name.CompareTo(tokens[1]) == 0)
                            {
                                remove = n;
                                found = true;
                                EndPoint ep = client.RemoteEndPoint;
                                c = new Client(tokens[1], ep, clientservice, client);
                                AppendMessage(DateTime.Now, cl.Host.ToString(), "ClientDisconnect", c.Name.ToString());
                            }
                        }
                        if (found)
                        {
                            clients.RemoveAt(remove);
                            charterList.RemoveAt(charterList.IndexOf(tokens[1]));
                        }
                        client.Close();
                        keepalive = false;
                    }
                }
            }
      

  11.   

     private void StartListening()
            {
                listener = new TcpListener(listenport);
                listener.Start();
                while (true)
                {
                    try
                    {
                        Socket s = listener.AcceptSocket();
                        clientsocket = s;
                        clientservice = new Thread(new ThreadStart(ServiceClient));
                        clientservice.Start();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                }
                //listener.Stop();
            }
      

  12.   

     private string GetChatterList()
    {            
                string chatters = "";
                int count = clients.Count;
                for (int n = 0; n < count; n++)
                {
                    Client cl = (Client)clients[n];
                    chatters = chatters + "%" + cl.Name.ToString();               
                }
                return chatters;
     }
     private string GetChatterList()
            {            
                string chatters = "";
                int count = clients.Count;
             //   MessageBox.Show(count.ToString());
                for (int n = 0; n < count; n++)
                {
                    Client cl = (Client)clients[n];
                    chatters = chatters + "%" + cl.Name.ToString();
                    if (count == 2)
                    {
                  //      MessageBox.Show("2:" + ((Client)clients[0]).Name.ToString() + ((Client)clients[1]).Name.ToString());
                    }
                    if (count == 1)
                    {
                  //      MessageBox.Show("1:" + ((Client)clients[0]).Name.ToString());
                    }
                   // chatters += ;
                }
                //chatters.Trim(new char[] { '|' });
                return chatters;
            }
     private void SendToClient(Client cl, string message)
            {
                try
                {
                    byte[] buffer = System.Text.Encoding.Default.GetBytes(message.ToCharArray());
                    cl.Sock.Send(buffer, buffer.Length, 0);
                }
                catch (Exception e)
                {
                    AppendMessage(DateTime.Now, "", "System", "Exception:" + e.Message.ToString());
                    cl.Sock.Close();
                    cl.CLThread.Abort();
                    clients.Remove(cl);
                  ////1111  lbClients.Items.Remove(cl.Name + " : " + cl.Host.ToString());
                }
            }
     private void SaveURLBtn_Click(object sender, EventArgs e)
            {
                if (URLBox.Text != "")
                {
                    DataSet URLDS = new DataSet();
                    URLDS.Tables.Add();
                    URLDS.Tables[0].Columns.Add("URL");
                    URLDS.Tables[0].Rows.Add(URLBox.Text);
                    URLDS.WriteXml("ConnectURL.xml");
                    AppendMessage(DateTime.Now, "", "System", "系统配置更改");
                }
                else
                {
                    MessageBox.Show("请填写应用服务URL!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
            }
     private delegate void AddMessage(DateTime FDateTime, string FIP, string FType, string FMessage);
            private void AppendMessage(DateTime FDateTime,string FIP,string FType,string FMessage)
            {
                if (this.MessageViewer.InvokeRequired)
                {
                    AddMessage AM = new AddMessage(AppendMessage);
                    this.MessageViewer.Invoke(AM, FDateTime, FIP, FType, FMessage);
                }
                else
                {
                    MainDataSet.Tables[0].Rows.Add(new string[] { FDateTime.ToString(), FIP, FType, FMessage });
                    if (FMessage.Contains("Exception:"))
                    {
                        MainDataSet.Tables[0].WriteXml(Application.StartupPath + "\\" + DateTime.Now.ToShortDateString() + "_" + DateTime.Now.Hour.ToString() + "-" + DateTime.Now.Minute.ToString() + "-" + DateTime.Now.Second.ToString() + "Exception.xml");
                        MainDataSet.Tables[0].Rows.Clear();
                        MainDataSet.Tables[0].AcceptChanges();
                    }
                    else
                    {
                        if (MainDataSet.Tables[0].Rows.Count >= 500)
                        {
                            MainDataSet.Tables[0].WriteXml(Application.StartupPath + "\\" + DateTime.Now.ToShortDateString() + "_" + DateTime.Now.Hour.ToString() + "-" + DateTime.Now.Minute.ToString() + "-" + DateTime.Now.Second.ToString() + ".xml");
                            MainDataSet.Tables[0].Rows.Clear();
                            MainDataSet.Tables[0].AcceptChanges();
                        }
                    }
                    MessageViewer.Refresh();
                }
            }
      private void ThisListener()
            {
                System.Diagnostics.Process[] processes = Process.GetProcesses();
                foreach (Process eachPro in processes)   //遍历每一个进程   
                {
                    if (eachPro.ProcessName.ToString() == "ServerListener")
                    {
                        return;
                    }
                }
                string SocketServerName = Application.StartupPath + "\\ServerListener.exe";
                System.Diagnostics.Process.Start(SocketServerName);
            }
      private void timer_Tick(object sender, EventArgs e)
            {
                #region 刷新当前在线人数;
                for (int n = 0; n < clients.Count; n++)
                {
                    Client cl = (Client)clients[n];
                    try
                    {
                        SendToClient(cl, "CONNECTTEST|");
                    }
                    catch (Exception ex)
                    {
                        ////AppendMessage(DateTime.Now, "", "System", "Exception:" + ex.Message.ToString());
                        //cl.Sock.Close();
                        //cl.CLThread.Abort();
                        //clients.Remove(cl);
                    }
                }
                DispLabel.Text = "当前" + clients.Count.ToString() + "人在线";
                #endregion
    }
      

  13.   

    StartListening 这个方法的代码
      

  14.   

    StartListening   这个方法的代码贴出来了  21楼贴出来的
      

  15.   

    Socket s = listener.AcceptSocket();
    clientsocket = s;
    clientservice = new Thread(new ThreadStart(ServiceClient));
    clientservice.Start();首先这样写很可能要出问题的,修改下
    Socket s = listener.AcceptSocket();
    clientservice = new Thread(ServiceClient);
    clientservice.Start(s);ServiceClient 方法加上参数
    private void ServiceClient(object obj)
    {
         Socket client = (Socket)obj;clientsocket 这个字段可以删掉