封装的一个套接字----服务端
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
}
}


posted @
2009-07-17 21:15
天纯蓝
阅读(
389)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步