public void Broadcast(ClientSocket srcSock) { Parallel.ForEach <ClientSocket>(portMap[srcSock].Clients, (dstSock, loopState) => { if (dstSock.SocketID == srcSock.SocketID) { loopState.Break(); } int mProcessId = GetProcessId(dstSock); if (mProcessId == -1) { loopState.Break(); } System.Net.Sockets.SocketInformation mInfomation = srcSock.cSocket.DuplicateAndClose(mProcessId); ExchangeObject mObject = new ExchangeObject { PackType = (int)Common.ECommand.SocketInfo, SerialNumber = 0, mData = Common.SerializeSocketInfo(mInfomation) }; mObject.PackLength = 12 + mObject.mData.Length; byte[] mBytes = mObject.ToBuffer(); server.SendData(dstSock.SocketID, mBytes); }); Logs.Create("根据映射配置,将" + srcSock.sRemoteIPAndPort.Replace(":", "_") + "的数据群发Broadcast到:" + portMap[srcSock].Clients.Count + "个客户端"); }
public void Send(byte[] data) { Task.Factory.StartNew(() => { int mSleepCount = (new Random((int)DateTime.Now.Ticks)).Next(10); ExchangeObject mObject = new ExchangeObject(); byte[] mBytes = mObject.ToBuffer <Data>(new Data { DataGuid = Guid.NewGuid(), Buffer = data }, Common.ECommand.Data); client.SendData(mBytes); Thread.Sleep(mSleepCount); }); }
void client_OnConnectEvent(object sender, ConnectEventArgs args) { SetStatus("连接服务器成功." + client.cSocket.RemoteEndPoint.ToString()); SetConencetStatus(true); //Task.Factory.StartNew(() => //{ int mProcessId = System.Diagnostics.Process.GetCurrentProcess().Id; ExchangeObject mObject = new ExchangeObject(); byte[] mBytes = mObject.ToBuffer <int>(mProcessId, Common.ECommand.Login); ((ClientSocket)sender).SendData(mBytes); Thread.Sleep(100); Send(null); //}); }
public void ExchangeTransfer(ClientSocket srcSock, ClientSocket dstSock) { if (dstSock.SocketID == srcSock.SocketID) { return; } int mProcessId = GetProcessId(dstSock); if (mProcessId == -1) { return; } System.Net.Sockets.SocketInformation mInfomation = srcSock.cSocket.DuplicateAndClose(mProcessId); ExchangeObject mObject = new ExchangeObject { PackType = (int)Common.ECommand.SocketInfo, SerialNumber = 0, mData = Common.SerializeSocketInfo(mInfomation) }; mObject.PackLength = 12 + mObject.mData.Length; byte[] mBytes = mObject.ToBuffer(); server.SendData(dstSock.SocketID, mBytes); //Thread.Sleep(100); //ExchangeObject mObject2 = new ExchangeObject(); //byte[] mBytes2 = mObject2.ToBuffer<Data>(new Data //{ // DataGuid = Guid.NewGuid(), // Buffer = null //}, Common.ECommand.Data); //byte[] mBytes2 = mObject2.ToBuffer<int>(mProcessId, Common.ECommand.Login); //server.SendData(dstSock.SocketID, mBytes2); Logs.Create("根据映射配置,将" + srcSock.sRemoteIPAndPort.Replace(":", "_") + "的数据转发ExchangeTransfer到:" + dstSock.sRemoteIPAndPort); }
void server_OnReceiveClientDataEvent(object sender, ReceiveDataEventArgs args) { ExchangeObject mObject = new ExchangeObject(); while (args.client.mBuffers.Count >= 12) { if (mObject.Format(args.client.mBuffers)) { switch ((Common.ECommand)mObject.PackType) { case Common.ECommand.Data: Data data = new Data(); if (mObject.GetStruct <Data>(ref data)) { if (data.Buffer != null) { byte[] dat = mObject.ToBuffer <Data>(data, Common.ECommand.Data); //(sender as SocketServer).SendData(args.client.SocketID, dat);//转发回给源客户端 long id = DataManager.AddData(args.client.sRemoteIPAndPort, data.Buffer); if (id == 0) { Logs.Create("记录中转数据到数据库失败!数据来源[" + args.client.sRemoteIPAndPort + "],数据为[" + Encoding.UTF8.GetString(data.Buffer) + "]"); } } } else { Console.WriteLine("解析Data对象错误"); Logs.Create("解析Data对象错误"); //(sender as SocketServer).CloseClient(args.client.SocketID); } break; case Common.ECommand.Login: int mProcessId = 0; if (mObject.GetStruct <int>(ref mProcessId)) { SetClientProcessId(args.client, mProcessId); //int port = Convert.ToInt32(args.client.sRemoteIPAndPort.Split(':')[1]); foreach (ClientSocket f in portMap.Keys) { foreach (ClientSocket t in portMap[f].Clients) { ExchangeTransfer(f, t); } } } else { Console.WriteLine("解析ProcessId对象错误"); Logs.Create("解析ProcessId对象错误"); //(sender as SocketServer).CloseClient(args.client.SocketID); } break; } } else { Console.WriteLine("对象错误" + args.client.mBuffers.Count.ToString()); args.client.mBuffers.RemoveAt(0); } } }