Exemple #1
0
        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;
            }
        }