Beispiel #1
0
        /// <summary>
        /// Добавление клиента
        /// </summary>
        public bool AddItem(TcpItem item, MessageChannelRequest request)
        {
            lock (internalLock)
            {
                if (item == null || request == null)
                {
                    return(false);
                }

                //отказ если очередь уже слушается
                //if (tcpItemList.Any(i => i.Channels != null && i.Channels.Any(c => request.Channels.Any(rc => rc == c.Name))))
                var connectedItem = tcpItemList.FirstOrDefault(i => i.Channels != null && i.Channels.Any(c => request.Channels.Any(rc => rc == c.Name)));
                if (connectedItem != null)
                {
                    if (connectedItem.IsActived())
                    {
                        return(false);
                    }
                    else
                    {
                        RemoveItem(connectedItem.Uid);
                    }
                }


                //привязка очереди к клиент если доступна
                item.Channels = channelList.Channels.Values.Where(c => request.Channels.Any(rc => rc == c.Name)).ToList();
                item.Channels.ForEach(c => c.Item = item);

                //добавление клиента в список прослушивающих
                tcpItemList.Add(item);

                return(true);
            }
        }
Beispiel #2
0
        public void Processing()
        {
            //генерация случайных очередей для получения сообщений
            var channel1 = rnd.Next(10);
            var channel2 = rnd.Next(10);

            Console.WriteLine("channel: {0}", channel1);
            Console.WriteLine("channel: {0}", channel2);

            NetworkStream stream = null;

            var client = new TcpClient();

            try
            {
                client.Connect(HostConstants.Host, HostConstants.Port);

                stream = client.GetStream();

                Console.WriteLine("await server hello");

                //получаем приветственное сообщение
                var helloMessage = ReceiveMessage(stream) as MessageChannelHello;

                if (helloMessage == null)
                {
                    Console.WriteLine("unknown server");
                    Console.ReadKey();
                }
                else
                {
                    Console.WriteLine("server: hello");

                    //отправляем запрос на подключение к очередям
                    var channelRequest = new MessageChannelRequest();
                    channelRequest.Channels = new string[] { channel1.ToString(), channel2.ToString() };
                    byte[] data = MessageBase.ToBytes(channelRequest);
                    stream.Write(data, 0, data.Length);

                    Thread.Sleep(500);

                    //получаем ответ на запрос подключения
                    var channelResponce = ReceiveMessage(stream) as MessageChannelResponce;

                    if (channelResponce == null || !channelResponce.Approve)
                    {
                        //если отказано завершаем работу
                        Console.WriteLine("connection {0} disapproved channels {1}", channelResponce == null ? Guid.Empty : channelResponce.Uid, string.Join(",", channelRequest.Channels));
                        Console.ReadKey();
                    }
                    else
                    {
                        //если разрешено начинаем получать сообщения из очереди
                        Console.WriteLine("connection {0} approved channels {1}", channelResponce.Uid, string.Join(",", channelRequest.Channels));
                        ReceiveMessages(client, stream);
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
            finally
            {
                Disconnect(client, stream);
            }
        }