给你参考一下我的代码
namespace GPSSubGateWayServer
{
class GPSCarService
{
public event ReceiveClientUDPMessageEventHandle OnReceiveClientUDPMessageEvent;
public event ReceiveClientTCPMessageEventHandle OnReceiveClientTCPMessageEvent;
public event ClientLoginEventHandle OnClientLoginEvent;
public event ClientLogOutEventHandle OnClientLogOutEvent;
Socket ServerSock;
IPAddress ServerIP;
int Port;
/// <summary>
/// 记录所有登陆过的ClientName,停止时使用
/// </summary>
ArrayList al_ClientName = ArrayList.Synchronized(new ArrayList());
ArrayList al_SendMessageOutQueue = ArrayList.Synchronized(new ArrayList());
/// <summary>
/// 存储车辆名称与接收线程
/// </summary>
//SortedList sl_Thread_ReceiveThread = SortedList.Synchronized(new SortedList());
/// <summary>
/// 存储车辆名称与接收信息的Socket;
/// </summary>
//SortedList sl_Socket_ClientName = SortedList.Synchronized(new SortedList());
/// <summary>
/// 存储车辆名称与Socket保护锁
/// </summary>
//SortedList sl_ClientSocketReaderWriterLock_ClientName = SortedList.Synchronized(new SortedList());
SortedList sl_ClientState_ClientName = SortedList.Synchronized(new SortedList());
ReaderWriterLock RWL_sl_ClientState_ClientName = new ReaderWriterLock();
Thread ListenClientThread;
ArrayList al_ClientEventArgs = ArrayList.Synchronized(new ArrayList());
Thread MoniteClintThread;
/// <summary>
/// 标志是否允许启动
/// </summary>
bool IFStart = false;
AutoResetEvent ARE_Listen = new AutoResetEvent(true);
//Thread TH_ReceiveNewClientLoginMessage;
// Thread TH_ReceiveNewClientLoginMessageMonite;
Thread TH_SendEvent;
Thread TH_SendMessage;
Thread TH_RecvUDPMessage;
System.Net.Sockets.UdpClient UdpReceiver;
public void SendMessage(MessageSendQueueItem Item)
{
this.al_SendMessageOutQueue.Add(Item);
}
public GPSCarService(string ServerIP, int ServerPort)
{
this.ServerSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.ServerIP = IPAddress.Parse(ServerIP);
this.Port = ServerPort;
this.UdpReceiver = new UdpClient(this.Port);
}
public void Start()
{
IPEndPoint ipep = new IPEndPoint(this.ServerIP, this.Port);
this.ServerSock.Bind(ipep);
this.ServerSock.Listen(10);
this.IFStart = true;
//启动监控线程
this.MoniteClintThread = new Thread(new ThreadStart(this.ThreadMoniteClient));
this.MoniteClintThread.Start();
//启动发送事件线程
this.TH_SendEvent = new Thread(new ThreadStart(this.ThreadEvent));
this.TH_SendEvent.Start();
//启动发送信息线程
this.TH_SendMessage = new Thread(new ThreadStart(this.ThreadSendMessage));
this.TH_SendMessage.Start();
//启动接收UDP的线程
this.TH_RecvUDPMessage = new Thread(new ThreadStart(this.ReceiveClientUDPMessage));
this.TH_RecvUDPMessage.Start();
//启动侦听连接线程
this.ListenClientThread = new Thread(new ThreadStart(this.ThreadListen));
this.ListenClientThread.Start();
}
private void ThreadEvent()
{
while (this.IFStart)
{
Thread.Sleep(1);
if (this.al_ClientEventArgs.Count > 0)
{
EventArgsItem eai = (EventArgsItem)this.al_ClientEventArgs[0];
this.al_ClientEventArgs.RemoveAt(0);
switch (eai.Type)
{
case EventArgsItemType.ClientLoginEventArgs:
{
ClientLoginEventArgs ea = (ClientLoginEventArgs)eai.Item;
//this.Writefile(DateTime.Now.ToString() + "\tClient " + ea.Name + " 连接");
if (this.OnClientLoginEvent != null)
{
this.OnClientLoginEvent(ea, this);
}
}
break;
case EventArgsItemType.ReceiveClientTCPMessageEventArgs:
{
ReceiveClientTCPMessageEventArgs ea = (ReceiveClientTCPMessageEventArgs)eai.Item;
if (this.OnReceiveClientTCPMessageEvent != null)
{
this.OnReceiveClientTCPMessageEvent(ea, this);
}
//this.Writefile(ea.ReceiveTime.ToString() + "\t" + ea.Name + "\t" + "TCP\t" + Convert.ToBase64String(ea.Message)); }
break;
case EventArgsItemType.ReceiveClientUDPMessageEventArgs:
{
ReceiveClientUDPMessageEventArgs ea = (ReceiveClientUDPMessageEventArgs)eai.Item;
if (this.OnReceiveClientUDPMessageEvent != null)
{
this.OnReceiveClientUDPMessageEvent(ea, this);
}
//this.Writefile(ea.ReceiveTime.ToString() + "\t" + ea.Name + "\t" + "UDP\t" + Convert.ToBase64String(ea.Message));
}
break;
case EventArgsItemType.ClientLogOutEventArgs:
{
ClientLogOutEventArgs ea = (ClientLogOutEventArgs)eai.Item;
if (this.OnClientLogOutEvent != null)
{
this.OnClientLogOutEvent(ea, this);
}
//this.Writefile(DateTime.Now.ToString() + "\tClient " + ea.ClientName + " 断开");
}
break;
}
}
}
}
private void ThreadListen()
{
while (this.IFStart)
{
this.ARE_Listen.Reset();
this.ServerSock.BeginAccept(new AsyncCallback(this.AcceptCallBack), null);
this.ARE_Listen.WaitOne();
Thread.Sleep(1000);
} }
private void WriteLog(string LogMessage)
{
lock (this)
{
if (!System.IO.Directory.Exists(System.Windows.Forms.Application.StartupPath + "\\LOG\\GPSServiceLog"))
{
System.IO.Directory.CreateDirectory(System.Windows.Forms.Application.StartupPath + "\\LOG\\GPSServiceLog");
}
string filepath = System.Windows.Forms.Application.StartupPath + "\\LOG\\GPSServiceLog\\" + DateTime.Now.ToLongDateString() + ".txt";
System.IO.FileStream fs = new FileStream(filepath, FileMode.Append, FileAccess.Write, FileShare.Read);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
sw.WriteLine(DateTime.Now.ToLongTimeString() + "\t" + LogMessage);
sw.Flush();
fs.Flush();
sw.Close();
fs.Close();
}
}
}
namespace GPSSubGateWayServer
{
class GPSCarService
{
public event ReceiveClientUDPMessageEventHandle OnReceiveClientUDPMessageEvent;
public event ReceiveClientTCPMessageEventHandle OnReceiveClientTCPMessageEvent;
public event ClientLoginEventHandle OnClientLoginEvent;
public event ClientLogOutEventHandle OnClientLogOutEvent;
Socket ServerSock;
IPAddress ServerIP;
int Port;
/// <summary>
/// 记录所有登陆过的ClientName,停止时使用
/// </summary>
ArrayList al_ClientName = ArrayList.Synchronized(new ArrayList());
ArrayList al_SendMessageOutQueue = ArrayList.Synchronized(new ArrayList());
/// <summary>
/// 存储车辆名称与接收线程
/// </summary>
//SortedList sl_Thread_ReceiveThread = SortedList.Synchronized(new SortedList());
/// <summary>
/// 存储车辆名称与接收信息的Socket;
/// </summary>
//SortedList sl_Socket_ClientName = SortedList.Synchronized(new SortedList());
/// <summary>
/// 存储车辆名称与Socket保护锁
/// </summary>
//SortedList sl_ClientSocketReaderWriterLock_ClientName = SortedList.Synchronized(new SortedList());
SortedList sl_ClientState_ClientName = SortedList.Synchronized(new SortedList());
ReaderWriterLock RWL_sl_ClientState_ClientName = new ReaderWriterLock();
Thread ListenClientThread;
ArrayList al_ClientEventArgs = ArrayList.Synchronized(new ArrayList());
Thread MoniteClintThread;
/// <summary>
/// 标志是否允许启动
/// </summary>
bool IFStart = false;
AutoResetEvent ARE_Listen = new AutoResetEvent(true);
//Thread TH_ReceiveNewClientLoginMessage;
// Thread TH_ReceiveNewClientLoginMessageMonite;
Thread TH_SendEvent;
Thread TH_SendMessage;
Thread TH_RecvUDPMessage;
System.Net.Sockets.UdpClient UdpReceiver;
public void SendMessage(MessageSendQueueItem Item)
{
this.al_SendMessageOutQueue.Add(Item);
}
public GPSCarService(string ServerIP, int ServerPort)
{
this.ServerSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
this.ServerIP = IPAddress.Parse(ServerIP);
this.Port = ServerPort;
this.UdpReceiver = new UdpClient(this.Port);
}
public void Start()
{
IPEndPoint ipep = new IPEndPoint(this.ServerIP, this.Port);
this.ServerSock.Bind(ipep);
this.ServerSock.Listen(10);
this.IFStart = true;
//启动监控线程
this.MoniteClintThread = new Thread(new ThreadStart(this.ThreadMoniteClient));
this.MoniteClintThread.Start();
//启动发送事件线程
this.TH_SendEvent = new Thread(new ThreadStart(this.ThreadEvent));
this.TH_SendEvent.Start();
//启动发送信息线程
this.TH_SendMessage = new Thread(new ThreadStart(this.ThreadSendMessage));
this.TH_SendMessage.Start();
//启动接收UDP的线程
this.TH_RecvUDPMessage = new Thread(new ThreadStart(this.ReceiveClientUDPMessage));
this.TH_RecvUDPMessage.Start();
//启动侦听连接线程
this.ListenClientThread = new Thread(new ThreadStart(this.ThreadListen));
this.ListenClientThread.Start();
}
private void ThreadEvent()
{
while (this.IFStart)
{
Thread.Sleep(1);
if (this.al_ClientEventArgs.Count > 0)
{
EventArgsItem eai = (EventArgsItem)this.al_ClientEventArgs[0];
this.al_ClientEventArgs.RemoveAt(0);
switch (eai.Type)
{
case EventArgsItemType.ClientLoginEventArgs:
{
ClientLoginEventArgs ea = (ClientLoginEventArgs)eai.Item;
//this.Writefile(DateTime.Now.ToString() + "\tClient " + ea.Name + " 连接");
if (this.OnClientLoginEvent != null)
{
this.OnClientLoginEvent(ea, this);
}
}
break;
case EventArgsItemType.ReceiveClientTCPMessageEventArgs:
{
ReceiveClientTCPMessageEventArgs ea = (ReceiveClientTCPMessageEventArgs)eai.Item;
if (this.OnReceiveClientTCPMessageEvent != null)
{
this.OnReceiveClientTCPMessageEvent(ea, this);
}
//this.Writefile(ea.ReceiveTime.ToString() + "\t" + ea.Name + "\t" + "TCP\t" + Convert.ToBase64String(ea.Message)); }
break;
case EventArgsItemType.ReceiveClientUDPMessageEventArgs:
{
ReceiveClientUDPMessageEventArgs ea = (ReceiveClientUDPMessageEventArgs)eai.Item;
if (this.OnReceiveClientUDPMessageEvent != null)
{
this.OnReceiveClientUDPMessageEvent(ea, this);
}
//this.Writefile(ea.ReceiveTime.ToString() + "\t" + ea.Name + "\t" + "UDP\t" + Convert.ToBase64String(ea.Message));
}
break;
case EventArgsItemType.ClientLogOutEventArgs:
{
ClientLogOutEventArgs ea = (ClientLogOutEventArgs)eai.Item;
if (this.OnClientLogOutEvent != null)
{
this.OnClientLogOutEvent(ea, this);
}
//this.Writefile(DateTime.Now.ToString() + "\tClient " + ea.ClientName + " 断开");
}
break;
}
}
}
}
private void ThreadListen()
{
while (this.IFStart)
{
this.ARE_Listen.Reset();
this.ServerSock.BeginAccept(new AsyncCallback(this.AcceptCallBack), null);
this.ARE_Listen.WaitOne();
Thread.Sleep(1000);
} }
private void WriteLog(string LogMessage)
{
lock (this)
{
if (!System.IO.Directory.Exists(System.Windows.Forms.Application.StartupPath + "\\LOG\\GPSServiceLog"))
{
System.IO.Directory.CreateDirectory(System.Windows.Forms.Application.StartupPath + "\\LOG\\GPSServiceLog");
}
string filepath = System.Windows.Forms.Application.StartupPath + "\\LOG\\GPSServiceLog\\" + DateTime.Now.ToLongDateString() + ".txt";
System.IO.FileStream fs = new FileStream(filepath, FileMode.Append, FileAccess.Write, FileShare.Read);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
sw.WriteLine(DateTime.Now.ToLongTimeString() + "\t" + LogMessage);
sw.Flush();
fs.Flush();
sw.Close();
fs.Close();
}
}
}
解决方案 »
- 怎么把windowsFrom程序打包成EXE可执行文件
- 【C#】 FileInfo[] files = dir.GetFiles("*.mp3")如何继续添加文件类型
- 求助: 一段文本的解析,Unicode, UTF8 or...?
- 无法更新标识列‘id’
- ms sql列默认值与dataset中默认值同步
- 关于Global类中的Application_Error事件捕捉到的异常,如何知道是程序的哪里发生的呢?
- 获取日期问题
- 100分求好书推荐!!!
- 关于des算法在C#和delphi的应用问题
- 我想在FORM1中按下按扭显示FORM2,怎么写呀?
- 写什么代码都没反应了
- 急求在线考试系统中试题 如何用Repeater 分页,点上下页还能保存上页所选答案?祝大家新年快乐
private void AsyncReceiveClientTCPMessge(System.IAsyncResult ar)
{
ClientState state = (ClientState)ar.AsyncState; int size = 0;
if (state == null)
{
return;
}
if (state.StateFlag > 1)
{
//资源已经被清理,不需要重复清理
return;
}
state.RWL_ClientSock.AcquireWriterLock(-1);
try
{
size = state.ClientSocket.EndReceive(ar);
}
catch (Exception ex)
{
//接收失败,清理资源
string str = ex.Message;
string log = "接收信息异常,原因-->" + ex.Message + "ClientName:" + state.ClientName;
this.WriteLog(log);
//先释放锁
state.RWL_ClientSock.ReleaseLock();
//this.sl_ClientState_ClientName.Remove(state.ClientName);
//申请全局保护锁
this.RWL_sl_ClientState_ClientName.AcquireWriterLock(-1);
if (this.sl_ClientState_ClientName.ContainsKey(state.ClientName))
{
//清除全局变量
//ClientState _cs = (ClientState)this.sl_ClientState_ClientName[state.ClientName];
if (state.StateFlag == 1)
{ //说明是车机断开,此处清理资源
System.Threading.Interlocked.Increment(ref state.StateFlag);
this.sl_ClientState_ClientName.Remove(state.ClientName);
try
{
//关闭连接
state.ClientSocket.Close();
}
catch
{ }
EventArgsItem eia = new EventArgsItem();
eia.Type = EventArgsItemType.ClientLogOutEventArgs;
ClientLogOutEventArgs eea = new ClientLogOutEventArgs();
eea.LogoutTime = DateTime.Now;
eea.ClientName = state.ClientName;
eia.Item = eea;
this.al_ClientEventArgs.Add(eia);
}
//否则,是重复连接或连接已断 }
this.RWL_sl_ClientState_ClientName.ReleaseLock();
return;
}
if (size == 0)
{ //接收失败,清理资源
//string str = ex.Message;
string log = "接收信息异常,原因-->接收到Client发送来的信息为0字节.ClientName:" + state.ClientName;
this.WriteLog(log);
state.RWL_ClientSock.ReleaseLock();
//this.sl_ClientState_ClientName.Remove(state.ClientName);
this.RWL_sl_ClientState_ClientName.AcquireWriterLock(-1);
if (this.sl_ClientState_ClientName.ContainsKey(state.ClientName))
{
//ClientState _cs = (ClientState)this.sl_ClientState_ClientName[state.ClientName];
if (state.StateFlag == 1)
{
System.Threading.Interlocked.Increment(ref state.StateFlag);
this.sl_ClientState_ClientName.Remove(state.ClientName);
try
{
//关闭连接
state.ClientSocket.Close();
}
catch
{ }
EventArgsItem eia = new EventArgsItem();
eia.Type = EventArgsItemType.ClientLogOutEventArgs;
ClientLogOutEventArgs eea = new ClientLogOutEventArgs();
eea.LogoutTime = DateTime.Now;
eea.ClientName = state.ClientName;
eia.Item = eea;
this.al_ClientEventArgs.Add(eia);
}
}
this.RWL_sl_ClientState_ClientName.ReleaseLock();
return;
}
state.SetLastRecvClientMessageTime();
state.RWL_ClientSock.ReleaseLock();
EventArgsItem eai = new EventArgsItem();
eai.Type = EventArgsItemType.ReceiveClientTCPMessageEventArgs;
ReceiveClientTCPMessageEventArgs ea = new ReceiveClientTCPMessageEventArgs();
ea.Message = new byte[size];
Array.Copy(state.bsBuffer, 0, ea.Message, 0, size);
ea.ReceiveTime = DateTime.Now;
ea.Name = state.ClientName;
eai.Item = ea;
this.al_ClientEventArgs.Add(eai);
state.bsBuffer.Initialize();// = new byte[1024];
state.RWL_ClientSock.AcquireWriterLock(-1);
try
{
state.ClientSocket.BeginReceive(state.bsBuffer, 0, 1024, SocketFlags.None, new AsyncCallback(this.AsyncReceiveClientTCPMessge), state);
}
catch (Exception ex)
{
//接收失败,清理资源
string str = ex.Message;
string log = "接收信息异常,原因-->" + ex.Message + "ClientName:" + state.ClientName;
this.WriteLog(log);
state.RWL_ClientSock.ReleaseLock();
//this.sl_ClientState_ClientName.Remove(state.ClientName);
this.RWL_sl_ClientState_ClientName.AcquireWriterLock(-1);
if (this.sl_ClientState_ClientName.ContainsKey(state.ClientName))
{
if (state.StateFlag == 1)
{
System.Threading.Interlocked.Increment(ref state.StateFlag);
this.sl_ClientState_ClientName.Remove(state.ClientName);
try
{
//关闭连接
state.ClientSocket.Close();
}
catch
{ }
EventArgsItem eia = new EventArgsItem();
eia.Type = EventArgsItemType.ClientLogOutEventArgs;
ClientLogOutEventArgs eea = new ClientLogOutEventArgs();
eea.LogoutTime = DateTime.Now;
eea.ClientName = state.ClientName;
eia.Item = eea;
this.al_ClientEventArgs.Add(eia);
} }
this.RWL_sl_ClientState_ClientName.ReleaseLock();
return;
}
state.RWL_ClientSock.ReleaseLock(); }
}
private void AcceptCallBack(System.IAsyncResult ar)
{
Socket sock;
try
{
sock = this.ServerSock.EndAccept(ar);
}
catch
{
//接受连接失败
this.ARE_Listen.Set();
return;
}
IPEndPoint ClientIPEP = (IPEndPoint)sock.RemoteEndPoint;
this.WriteLog("有新连接接入,IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString());
//this.NewSocke = sock; //TH_ReceiveNewClientLoginMessage = new Thread(new ThreadStart(this.ReceiveNewClientLoginMessage));
//TH_ReceiveNewClientLoginMessage.Start();
//TH_ReceiveNewClientLoginMessageMonite = new Thread(new ThreadStart(this.ReceiveNewClientLoginMessageMonite));
//TH_ReceiveNewClientLoginMessageMonite.Start();
byte[] bsmsg = new byte[1024];
int size = 0;
try
{
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString()+"\t准备连接");
Socket tempSocket = sock;
tempSocket.ReceiveTimeout = 1;
size = tempSocket.Receive(bsmsg);
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString()+"\t接到连接后第一条信息");
}
catch(Exception ex)
{
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() + "连接成功后没有发送任何信息,准备关闭"+ex.Message);
try
{
sock.Close();
}
catch
{ }
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() + "连接被关闭");
this.ARE_Listen.Set();
return;
} if (size == 0)
{
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() + "信息长度为0");
try
{
sock.Close();
}
catch
{ }
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() + "连接被关闭");
this.ARE_Listen.Set();
return;
}
string msg = "";
try
{
msg = System.Text.Encoding.ASCII.GetString(bsmsg, 0, size);
}
catch
{
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() +"转换字符时出现错误\t"+msg);
try
{
sock.Close();
}
catch
{ }
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() + "连接被关闭");
this.ARE_Listen.Set();
return;
}
// bsmsg.Initialize();
// size=this.NewSocke.Receive(bsmsg,0,1024,System.Net.Sockets.SocketFlags.None);
if (msg.Length < 14)
{
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() + "消息长度不够\t"+msg);
try
{
sock.Close();
}
catch
{ }
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() + "连接被关闭");
this.ARE_Listen.Set();
return;
}
int i = 0;
while (i < 10)
{
//检查接收数据的4-14位是否为数字,否则为错误数据
if (!char.IsLetterOrDigit(msg[i + 4]))
{
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() + "无法识别的主机号\t"+msg);
try
{
sock.Close();
}
catch
{ }
//this.WriteTemp("IP:" + ClientIPEP.Address.ToString() + "端口:" + ClientIPEP.Port.ToString() + "连接被关闭");
this.ARE_Listen.Set();
return;
}
i++;
}
string ClientName = msg.Substring(4, 10);
if (!this.al_ClientName.Contains(ClientName))
{
this.al_ClientName.Add(ClientName);
}
ClientState cs = new ClientState();
cs.ClientName = ClientName;
cs.ClientSocket = sock;
cs.RWL_ClientSock = new ReaderWriterLock();
cs.bsBuffer = new byte[1024];
this.RWL_sl_ClientState_ClientName.AcquireWriterLock(-1);
if (!this.sl_ClientState_ClientName.ContainsKey(ClientName))
{
this.sl_ClientState_ClientName.Add(ClientName, cs);
}
else
{
//系统曾经有连接
ClientState _Client = (ClientState)this.sl_ClientState_ClientName[ClientName];
this.sl_ClientState_ClientName.Remove(ClientName);
System.Threading.Interlocked.Increment(ref _Client.StateFlag);//提示其他线程不需要再清理资源
try
{
_Client.ClientSocket.Close();
}
catch
{ }
_Client.RWL_ClientSock.ReleaseLock();
EventArgsItem eia = new EventArgsItem();
eia.Type = EventArgsItemType.ClientLogOutEventArgs;
ClientLogOutEventArgs eea = new ClientLogOutEventArgs();
eea.LogoutTime = DateTime.Now;
eea.ClientName = ClientName;
eia.Item = eea;
this.al_ClientEventArgs.Add(eia);
this.sl_ClientState_ClientName.Add(ClientName, cs);
}
this.RWL_sl_ClientState_ClientName.ReleaseLock();
//声称登陆事件
EventArgsItem eai = new EventArgsItem();
eai.Type = EventArgsItemType.ClientLoginEventArgs;
ClientLoginEventArgs ea = new ClientLoginEventArgs();
ea.ClientIPEP = ClientIPEP;
ea.Message = new byte[size];
Array.Copy(bsmsg, 0, ea.Message, 0, size);
ea.LoginDate = DateTime.Now;
ea.Name = ClientName;
eai.Item = ea;
this.al_ClientEventArgs.Add(eai);
//下面开始接收数据
this.WriteLog("准备开始异步接收从" + ClientName + "发送来的数据IP:" + ClientIPEP.Address.ToString() + ":" + ClientIPEP.Port.ToString());
cs.RWL_ClientSock.AcquireWriterLock(-1);
try
{
cs.ClientSocket.BeginReceive(cs.bsBuffer, 0, 1024, SocketFlags.None, new AsyncCallback(AsyncReceiveClientTCPMessge), cs);
}
catch
{ }
cs.RWL_ClientSock.ReleaseLock();
this.ARE_Listen.Set(); }
private void ReceiveClientUDPMessage()
{
IPEndPoint ServerIPEP = new IPEndPoint(this.ServerIP, this.Port);
while (this.IFStart)
{
try
{
EventArgsItem eai = new EventArgsItem();
eai.Type = EventArgsItemType.ReceiveClientUDPMessageEventArgs;
ReceiveClientUDPMessageEventArgs ea = new ReceiveClientUDPMessageEventArgs();
ea.Message = new byte[bsmsg.Length];
Array.Copy(bsmsg, 0, ea.Message, 0, bsmsg.Length);
ea.ReceiveTime = DateTime.Now;
ea.Name = bsmsg[1].ToString("X") + bsmsg[2].ToString("X") + bsmsg[3].ToString("X") + bsmsg[4].ToString("X") + bsmsg[5].ToString("X");
eai.Item = ea;
string strtemp = "";
for (int i = 0; i < bsmsg.Length; i++)
{
strtemp += bsmsg[i].ToString("X2");
}
this.WriteTemp(strtemp);
}
catch (Exception ex)
{
string str = ex.Message;
this.WriteLog("接收UDP数据异常,原因-->" + ex.Message);
}
}
}
[code=C#]
private void ReceiveClientUDPMessage()
{
IPEndPoint ServerIPEP = new IPEndPoint(this.ServerIP, this.Port);
while (this.IFStart)
{
try
{
EventArgsItem eai = new EventArgsItem();
eai.Type = EventArgsItemType.ReceiveClientUDPMessageEventArgs;
ReceiveClientUDPMessageEventArgs ea = new ReceiveClientUDPMessageEventArgs();
ea.Message = new byte[bsmsg.Length];
Array.Copy(bsmsg, 0, ea.Message, 0, bsmsg.Length);
ea.ReceiveTime = DateTime.Now;
ea.Name = bsmsg[1].ToString("X") + bsmsg[2].ToString("X") + bsmsg[3].ToString("X") + bsmsg[4].ToString("X") + bsmsg[5].ToString("X");
eai.Item = ea;
string strtemp = "";
for (int i = 0; i < bsmsg.Length; i++)
{
strtemp += bsmsg[i].ToString("X2");
}
this.WriteTemp(strtemp);
}
catch (Exception ex)
{
string str = ex.Message;
this.WriteLog("接收UDP数据异常,原因-->" + ex.Message);
}
}
}
[/code]
你主要看
ThreadListen()方法开始侦听连接
AcceptCallBack()异步接收数据并为每个连接创建Socket
AsyncReceiveClientTCPMessge()每个连接的异步接收数据不明白的地方直接问我另外还有个封装连接的类
public class ClientState
{
public string ClientName;
public Socket ClientSocket;
public ReaderWriterLock RWL_ClientSock;
public byte[] bsBuffer;
public int StateFlag = 1;
public DateTime LastReceiveClientMessageTime;
private ReaderWriterLock RWL_LastReceiveClientMessageTime;
public int GetNoDataTimeSpan()
{
this.RWL_LastReceiveClientMessageTime.AcquireReaderLock(-1);
TimeSpan ts = DateTime.Now - this.LastReceiveClientMessageTime;
this.RWL_LastReceiveClientMessageTime.ReleaseReaderLock();
return (int)ts.TotalSeconds;
}
public void SetLastRecvClientMessageTime()
{
this.RWL_LastReceiveClientMessageTime.AcquireWriterLock(-1);
this.LastReceiveClientMessageTime = DateTime.Now;
this.RWL_LastReceiveClientMessageTime.ReleaseLock();
}
//public byte[] LoginMessage;
public ClientState()
{
this.bsBuffer = new byte[1024];
this.LastReceiveClientMessageTime = DateTime.Now;
this.RWL_LastReceiveClientMessageTime = new ReaderWriterLock();
}
}