Esempio n. 1
0
        /// <summary>
        /// 对数据进行打包,然后再发送
        /// </summary>
        /// <param name="token"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public bool Send(BaseNetObject baseNetObject)
        {
            byte[] message   = NetBaseTool.ObjectToBytes(baseNetObject);
            bool   isSuccess = false;

            if (Socket == null || !Socket.Connected)
            {
                return(isSuccess);
            }
            try
            {
                //对要发送的消息,制定简单协议,头4字节指定包的大小,方便客户端接收(协议可以自己定)
                byte[] buff = new byte[message.Length + 4];
                byte[] len  = BitConverter.GetBytes(message.Length);
                Array.Copy(len, buff, 4);
                Array.Copy(message, 0, buff, 4, message.Length);
                //token.Socket.Send(buff);  //
                //新建异步发送对象, 发送消息
                SocketAsyncEventArgs sendArg = new SocketAsyncEventArgs();
                sendArg.UserToken = this;
                sendArg.SetBuffer(buff, 0, buff.Length);  //将数据放置进去.
                isSuccess = Socket.SendAsync(sendArg);
            }
            catch (Exception e)
            {
                Logger.WriteLog("SendMessage - Error:" + e.Message);
            }
            return(isSuccess);
        }
Esempio n. 2
0
 /// <summary>
 /// 销毁网络连接控制器
 /// </summary>
 public static void CreateConnnect(ServerDataType type, string ip, int port, ConnnectType connnectType = ConnnectType.SocketObject, bool hasHeader = true)
 {
     DestroyConnnect();
     CurrConnnectType = connnectType;
     _NetObject       = Activator.CreateInstance(Type.GetType(connnectType + ""), type, ip, port, hasHeader) as BaseNetObject;
     _NetObject.CreateConnect();
 }
Esempio n. 3
0
 private void Receive(object o)
 {
     try
     {
         while (used)
         {
             BaseNetObject baseNetObject = NetBaseTool.ReceiveBaseNetObject(socket);
             if (baseNetObject is HeartBeat)
             {
                 receiveHeartBeat = true;
                 Logger.WriteLog("receive heartbeat confirm alive");
                 if (!useHeartBeat)
                 {
                     SendBaseNetObjects.Enqueue(new HeartBeat());
                 }
             }
             else
             {
                 ReceiveBaseNetObjects.Enqueue(baseNetObject);
             }
             Thread.Sleep(DELAY);
         }
     }
     catch (SocketException e)
     {
         if (t != null)
         {
             t.Stop();
         }
         Logger.WriteException(e, "心跳中断");
         used = false;
         return;
     }
 }
Esempio n. 4
0
 private void Send(object o)
 {
     try
     {
         while (used)
         {
             if (SendBaseNetObjects.Count > 0)
             {
                 BaseNetObject baseNetObject = SendBaseNetObjects.Dequeue();
                 NetBaseTool.SendBaseNetObject(socket, baseNetObject);
             }
             Thread.Sleep(DELAY);
         }
     }
     catch (SocketException e)
     {
         if (t != null)
         {
             t.Stop();
         }
         Logger.WriteException(e, "心跳中断");
         used = false;
         return;
     }
 }
Esempio n. 5
0
 /// <summary>
 /// 将一个object对象序列化,返回一个byte[]
 /// </summary>
 /// <param name="obj">能序列化的对象</param>
 /// <returns></returns>
 public static byte[] ObjectToBytes(BaseNetObject obj)
 {
     using (MemoryStream ms = new MemoryStream())
     {
         IFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, obj);
         return(ms.GetBuffer());
     }
 }
Esempio n. 6
0
 /// <summary>
 /// 销毁网络连接控制器
 /// </summary>
 public static void DestroyConnnect()
 {
     if (_NetObject != null)
     {
         _NetObject.Disconnect();
     }
     _NetObject = null;
 }
Esempio n. 7
0
        public void Datahandle(byte[] bytes)
        {
            BaseNetObject bno = NetBaseTool.BytesToObject(bytes) as BaseNetObject;

            if (bno is SystemNetObject)
            {
                SystemNetObject systemNetObject = bno as SystemNetObject;
                if (systemNetObject.GetType() == typeof(Msg))
                {
                    Console.WriteLine(systemNetObject);
                }
                else if (systemNetObject.GetType() == typeof(GetMyUserData))
                {
                    MyUserData = (systemNetObject as GetMyUserData).userData;
                }
                else if (systemNetObject.GetType() == typeof(CreateRoomS2C))
                {
                    transmit = (systemNetObject as CreateRoomS2C).PlayerId;
                    wait.Set();
                }
                else if (systemNetObject.GetType() == typeof(JoinRoomS2C))
                {
                    transmit = (systemNetObject as JoinRoomS2C);
                    wait.Set();
                }
                else if (systemNetObject.GetType() == typeof(GetRoomListS2C))
                {
                    transmit = (systemNetObject as GetRoomListS2C).rooms;
                    wait.Set();
                }
                else if (systemNetObject.GetType() == typeof(PlayerJoinS2C))
                {
                    PlayerJoin?.Invoke((systemNetObject as PlayerJoinS2C).playerId);
                }
                else if (systemNetObject.GetType() == typeof(PlayerLeaveS2C))
                {
                    PlayerLeave?.Invoke((systemNetObject as PlayerLeaveS2C).playerId);
                }
                else if (systemNetObject.GetType() == typeof(GameStart))
                {
                    StartAction?.Invoke();
                }
            }
            else
            {
                GameNetObject gno = bno as GameNetObject;
                if (gno == null)
                {
                    throw new ArgumentException(bno.GetType() + " Can't Used");
                }
                ReceiveAction?.Invoke(gno);
            }
            //防止死锁
            // wait.Set();
        }
Esempio n. 8
0
 /// <summary>
 /// 对房间所有的玩家发送消息
 /// </summary>
 /// <param name="room"></param>
 /// <param name="baseNetObject"></param>
 public void SendDataToRoomPlayer(BaseRoom room, BaseNetObject baseNetObject, List <Guid> notSends)
 {
     foreach (var playerId in room.Players)
     {
         if (!notSends.Contains(playerId) && playerId != Guid.Empty)
         {
             //发送玩家加入消息
             SendData(id2players[playerId], baseNetObject);
         }
     }
 }
Esempio n. 9
0
 public static void SendBaseNetObject(Socket s, BaseNetObject baseNetObject)
 {
     SendVarData(s, ObjectToBytes(baseNetObject));
 }
Esempio n. 10
0
 private void Send(BaseNetObject baseNetObject)
 {
     m_clientSocket.Send(NetBaseTool.ObjectToBytes(baseNetObject));
 }
Esempio n. 11
0
 /// <summary>
 /// 对token发送baseNetObject
 /// </summary>
 /// <param name="token">用户</param>
 /// <param name="baseNetObject">消息</param>
 /// <returns></returns>
 public bool SendData(UserToken token, BaseNetObject baseNetObject)
 {
     return(token.Send(baseNetObject));
     //return SendData(token, NetBaseTool.ObjectToBytes(baseNetObject));
 }
Esempio n. 12
0
 /// <summary>
 /// 对房间所有的玩家发送消息
 /// </summary>
 /// <param name="room"></param>
 /// <param name="baseNetObject"></param>
 public void SendDataToRoomAllPlayer(BaseRoom room, BaseNetObject baseNetObject)
 {
     SendDataToRoomPlayer(room, baseNetObject, new List <Guid>());
 }