private void TcpListener_onMessage(IPEndPoint endpoint, MetaData md, string msg) { MetaData.Roles role = md.Role; switch (role) { case MetaData.Roles.dispatcher: if (md.Action == MetaData.Actions.getCacheAdress) { conToCacheServer(msg); } break; case MetaData.Roles.client: if (md.Action == MetaData.Actions.refNews) { Console.WriteLine(); echo("получен запрос на реферирование от " + endpoint.ToString()); Referator referator = null; string fullArticle = ""; string[] refParameters = msg.Split('|'); string url = refParameters[0]; byte compressPerc = byte.Parse(refParameters[1]); // hack: здесь нужно дописать запрос на кэшированную версию // пока что всегда реферируем без проверки на кэш bool hasCache = false; bool passed = false; try { cs.cacheFileExists(url, out hasCache, out passed); } catch { hasCache = false; } if (hasCache && passed) { echo("берем кэш версию"); string cachedXML; try { cachedXML = cs.getCachedFile(url); referator = new Referator(cachedXML); echo("обработка кэш-версии статьи"); } catch { Console.WriteLine(" для {0}", endpoint.ToString()); HtmlParser hp = new HtmlParser(url); fullArticle = hp.Text; echo("начинаем реферирование"); referator = new Referator(fullArticle, "utf-8"); } } else { if (passed) { cs.notifyReferation(url); echo("сазали кэшу, что будем реферировать"); } try { // берем статью из интернета Console.WriteLine(" для {0}", endpoint.ToString()); HtmlParser hp = new HtmlParser(url); fullArticle = hp.Text; echo("начинаем реферирование"); referator = new Referator(fullArticle, "utf-8"); string articleXml = referator.getXml(); //todo: отправляем кэш серверу articleXml if (passed) { cacheMSMQ.Send(articleXml, url); } } catch (Exception ex) { //todo: обработать ошибку если не удалось скачать статью Console.WriteLine("Ошибка в обращении к сайту или реферирования"); } } string compressedArticle = referator.Compress(compressPerc); MetaData articleMD = new MetaData(MetaData.Roles.server, MetaData.Actions.refNews, MetaData.ContentTypes.plainText, compressedArticle); tcpListener.Send(endpoint, compressedArticle, articleMD); } break; default: Console.WriteLine("Не опознанная команда " + md.Action + " от " + md.Role); break; } }