/// <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); } }
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); } }