Beispiel #1
0
 /// <summary>
 /// Join group after connected to the server. Make sure the server enable group feature before call this method.
 /// </summary>
 /// <param name="groupArray">The group array that the client to join.</param>
 public void JoinGroup(params string[] groupArray)
 {
     if (_clientStatus != ClientStatus.Connected)
     {
         throw new Exception(Constants.ExMessageClientNotConnected);
     }
     byte[] joinGroupMessage = JoinGroupMessage.MakeMessage(groupArray);
     SendMessageAsync(joinGroupMessage, null, null);
     _groupArray = groupArray;
 }
Beispiel #2
0
 public static bool TryParse(ArraySegment <byte> messageRawData, out JoinGroupMessage outMessage)
 {
     //| mark(4bytes) | group names |
     try
     {
         if (messageRawData.Count <= 4)
         {
             outMessage = null;
             return(false);
         }
         UInt32 joinGroupMark = BitConverter.ToUInt32(messageRawData.Array, messageRawData.Offset);
         string groupNameDes  = Encoding.UTF8.GetString(messageRawData.Array, messageRawData.Offset + 4, messageRawData.Count - 4);
         if (string.IsNullOrWhiteSpace(groupNameDes))
         {
             outMessage = null;
             return(false);
         }
         string[]             groupArray = groupNameDes.Split('|');
         IEnumerable <string> groupList  = groupArray.Where(p => p.Trim() != "");
         if (!groupList.Any())
         {
             outMessage = null;
             return(false);
         }
         JoinGroupMessage joinGroupMsg = new JoinGroupMessage()
         {
             JoinGroupMark = joinGroupMark,
             GroupSet      = new HashSet <string>(groupList)
         };
         outMessage = joinGroupMsg;
         return(true);
     }
     catch
     {
         outMessage = null;
         return(false);
     }
 }
Beispiel #3
0
        protected override void OnRawMessageReceived(TcpRawMessageReceivedEventArgs args)
        {
            if (args.Error == null)
            {
                ArraySegment <byte> rawSegment = args.Message.MessageRawData;
                if (rawSegment.Count >= 4)
                {
                    UInt32 specialMark = BitConverter.ToUInt32(rawSegment.Array, rawSegment.Offset);
                    if (specialMark == TcpUtility.JOIN_GROUP_MARK)
                    {
                        if (!EnableGroup)
                        {
                            return;
                        }

                        JoinGroupMessage joinGroupMsg = null;
                        if (!JoinGroupMessage.TryParse(rawSegment, out joinGroupMsg))
                        {
                            return;
                        }

                        if (_clients.TryGetValue(args.Message.ClientID, out ClientContext clientContext))
                        {
                            clientContext.Groups = joinGroupMsg.GroupSet;
                            AddClientToGroup(clientContext);
                        }
                        return;
                    }
                    else if (specialMark == TcpUtility.GROUP_TRANSMIT_MSG_MARK ||
                             specialMark == TcpUtility.GROUP_TRANSMIT_MSG_LOOP_BACK_MARK)
                    {
                        bool loopBack = specialMark == TcpUtility.GROUP_TRANSMIT_MSG_LOOP_BACK_MARK;
                        if (!EnableGroup)
                        {
                            return;
                        }
                        GroupTransmitMessage transPacket = null;
                        if (!GroupTransmitMessage.TryParse(rawSegment, out transPacket))
                        {
                            return;
                        }
                        try
                        {
                            if (!ServerConfig.AllowCrossGroupMessage)
                            {
                                ClientContext sourceClient = GetClient(args.Message.ClientID);
                                if (sourceClient == null || sourceClient.Groups == null || sourceClient.Groups.Count == 0)
                                {
                                    return;
                                }
                                foreach (string groupName in transPacket.GroupNameCollection)
                                {
                                    if (!sourceClient.Groups.Contains(groupName))
                                    {
                                        return;
                                    }
                                }
                            }
                            SendGroupMessageAsync(transPacket.GroupNameCollection, transPacket.TransMessageData.Array, transPacket.TransMessageData.Offset, transPacket.TransMessageData.Count
                                                  , loopBack ? -1 : args.Message.ClientID);
                        }
                        catch (Exception ex)
                        {
                            _logger?.Warn("Transmit group message exception.", ex.Message);
                        }
                        return;
                    }
                }
                if (ReceivedMessageFilter(args))
                {
                    return;
                }
            }

            MessageReceived?.Invoke(this, args);
            return;
        }