internal void ProcessInternalMessage(InternalMessage message)
            {
                switch (message.MessageType)
                {
                case InternalMessageType.ClientList:
                    StringReader reader = new StringReader(message.Content);
                    string       client;
                    while ((client = reader.ReadLine()) != null)
                    {
                        AddConnectableClient(client);
                    }
                    break;

                case InternalMessageType.ClientConnected:
                    AddConnectableClient(message.Content, onClientConnected);
                    break;

                case InternalMessageType.ClientDisconnected:
                    ConnectableClients = ConnectableClients.Remove(message.Content);
                    onClientDisconnected?.Invoke(message.Content);
                    parent.onRemoteHostDisconnected?.Invoke();
                    break;

                case InternalMessageType.RegistrationRequest:
                    parent.remoteHostName.Value = message.Sender;
                    break;

                case InternalMessageType.ConnectionRequest:
                    parent.onRemoteJoinedHostName.Value = message.Content;
                    break;

                case InternalMessageType.BroacastRequest:
                    short setBroadcastedType = short.Parse(message.Content);
                    switch (setBroadcastedType)
                    {
                    case (short)BroadcastSettingCodes.Cancel:
                        broadcastedType.Value     = EMPTY_BROADCASTED_TYPE;
                        broadcastEverything.Value = false;
                        break;

                    case (short)BroadcastSettingCodes.BroadcastEverythingTrue:
                        broadcastEverything.Value = true;
                        break;

                    case (short)BroadcastSettingCodes.BroadcastEverythingFalse:
                        broadcastEverything.Value = false;
                        break;

                    default:
                        broadcastedType.Value = setBroadcastedType;
                        break;
                    }
                    break;

                default:
                    break;
                }
            }
 private void AddConnectableClient(string clientDescription, Action <string> onSuccessAction)
 {
     string[] tokens = clientDescription.Split('@');
     if (tokens.Length != 2 ||
         !IPAddress.TryParse(tokens[1], out IPAddress ipAddress))
     {
         throw new FormatException("Invalid format of connectable client.");
     }
     ConnectableClients = ConnectableClients.Add(tokens[0], remoteEndPointFactory.Create(ipAddress));
     onSuccessAction?.Invoke(tokens[0]);
 }