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
}
}
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
}
}