C#winform异常问题 现在有一个winform程序,有很多个winform客户端,服务端也有一个winform,是用来用来记录和监视客户端之间的通讯。现在有个问题是,winform客户端出现异常的时候,会拖死服务端的winform监视程序。有什么办法当winform客户端出现异常的时候,不会拖死服务端winform监视程序。大家多多帮忙,晒晒思路代码都行,这个问题解决在追加分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 try{ 客户端逻辑}cache(exception e){ 给server发送该客户端异常信息 断掉和server端的连接}finnaly{ 释放非托管资源} 怎么通信? 客户端通信-->记录通信信息-->传给服务器-->服务器进行监听-->当客户端出现问题不发送或发送错误的信息 给服务器(是这里出现问题吗?)-->服务器接受不到信息,或超时,或接受错误处理出现问题-->服务器出现死机无响应。。还是多线程出现问题? 恩,是的,是把服务端的winform程序拖死,程序崩溃退出了 是把服务端的winform程序拖死了,自动崩溃退出 你这是拖死也太抽象了,是程序异常关闭了,还是程序错误,导致主机的cpu和内存都被占用了 服务端在接收发送的地方加上 try catch 处理异常 一下是服务端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; } } }} 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(); } 这些都没用,要 StartListening 这个方法的代码 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; } } } 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(); } 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} StartListening 这个方法的代码 StartListening 这个方法的代码贴出来了 21楼贴出来的 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 这个字段可以删掉 datagridview 合并单元格问题【WINFORM】 C#程序问题,自动启动,自动关闭。 这个问题很简单,但是蹊跷!我在线等着:) 求助:文件读入的提示argumentexception错误问题 将access数据转移到sqlserver c#中out的作用 关于DataReader和ListBox的连接 c# modbus-RTU问题,小白求帮助 combobox能不能显示textbox的样子?? 用.NET开发的应用程序在Windows98下不能正常运行,如何解决? 如何将从接口获取的xml格式数据 显示到dataGridView C# 写C++ 的一句话,关于指针的,跪求啊啊啊啊
{
客户端逻辑
}
cache(exception e)
{
给server发送该客户端异常信息
断掉和server端的连接
}
finnaly
{
释放非托管资源
}
客户端通信-->记录通信信息-->传给服务器-->服务器进行监听-->当客户端出现问题不发送或发送错误的信息 给服务器(是这里出现问题吗?)-->服务器接受不到信息,或超时,或接受错误处理出现问题-->服务器出现死机无响应。。
还是多线程出现问题?
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; }
} }
}
{
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(); }
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;
}
}
}
{
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();
}
{
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
}
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 这个字段可以删掉