using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Threading; namespace EarlyServer { public class ConnectClient : IDisposable { Member#region Member private Socket m_Socket; private string m_NetWorkName; private Thread m_Thread; private bool disposed = false; private bool m_IsRuning = false; public event CommandReceiveEventHandler CommandReceived; #endregion public ConnectClient(Socket socket, string netWorkName) { m_Socket = socket; m_NetWorkName = netWorkName; } Public Methods#region Public Methods public void Start() { m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); m_Thread = new Thread(new ThreadStart(ThreadFunction)); m_Thread.IsBackground = true; m_Thread.Start(); } #endregion Private Methods#region Private Methods private void ThreadFunction() { m_IsRuning = true; while (m_IsRuning) { byte[] byteMessage = null; ; string tmpStr = string.Empty; while (ServiceStartFlag) { try { if (m_Socket.Connected) { byteMessage = new byte[1000]; int len = m_Socket.Receive(byteMessage); if (len > 0) { tmpStr = Encoding.UTF8.GetString(byteMessage); if (tmpStr.Length > 0) { string[] ary = tmpStr.Split('|'); if (ary.Length > 3) { //命令|发送者|目标|内容 MsgCommand cmd = new MsgCommand(ary[0], ary[1], ary[2], tmpStr.Replace(ary[0] + "|" + ary[1] + "|" + ary[2] + "|", "")); this.OnCommandReceived(this, new CommandEventArgs(cmd)); } } } } } catch (SocketException ex) { m_IsRuning = true; ClientData.List.Remove(m_NetWorkName); } } } } #endregion event Methods#region event Methods private void OnCommandReceived(object sender, CommandEventArgs e) { if (CommandReceived != null) { CommandReceived(this, e); } } #endregion IDisposable 成员#region IDisposable 成员 public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!this.disposed) { this.Close(); // 注意这里不是线程安全的 } disposed = true; } public void Close() { if (disposed) { m_IsRuning = false; m_Thread.Abort(); } MsgCommand cmd = new MsgCommand(CommandType.Outing, this.m_ServerIPAddress, this.m_NetWorkName); this.SendToServer(cmd); this.m_Socket.Close(); this.m_NetworkStream.Close(); } ~ConnectClient() { Dispose(false); } #endregion } public class ClientData { public static Dictionary<string, ConnectClient> List = new Dictionary<string, ConnectClient>(); } public delegate void CommandReceiveEventHandler(object sender, CommandEventArgs eventArgs); public class CommandEventArgs : EventArgs { private MsgCommand m_MsgCommand; public MsgCommand Command { get { return m_MsgCommand; } } public CommandEventArgs(MsgCommand msgCommand) { this.m_MsgCommand = msgCommand; } } public class MsgCommand { private string commnadString; /**//// <summary> /// 发送者名称 /// </summary> public string CommnadString { get { return commnadString; } set { commnadString = value; } } private string senderName; /**//// <summary> /// 发送者名称 /// </summary> public string SenderName { get { return senderName; } set { senderName = value; } } private string targetName; /**//// <summary> /// 目标名称 /// </summary> public string TargetName { get { return targetName; } set { targetName = value; } } private string commandBody; /**//// <summary> /// 内容 /// </summary> public string MetaData { get { return commandBody; } set { commandBody = value; } } Constructors#region Constructors public MsgCommand(string commnadstring, string sendername, string targetName, string metaData) { this.commnadString = commnadstring; this.senderName = sendername; this.commandBody = metaData; this.targetName = targetName; } #endregion }}