Esempio n. 1
0
        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 + "个客户端");
        }
Esempio n. 2
0
 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);
     });
 }
Esempio n. 3
0
        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);
            //});
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
                }
            }
        }