示例#1
0
        void register(IPEndPoint endpoint, MetaData.Roles role)
        {
            if (role == MetaData.Roles.cache)
            {
                cacheServer = endpoint.Address.ToString();
                //Console.WriteLine("Зарегистрирован кэш-сервер по адресу " + endpoint.Address.ToString());

                servers.ToList().ForEach(x => x.SendCacheIP(cacheServer));
            }
            else
            {
                var rs = new RefServer(endpoint, this);
                servers.Add(rs);
                //Console.WriteLine("Зарегистрирован сервер реферирования по адресу " + endpoint.Address.ToString());
                if (cacheServer != String.Empty)
                {
                    rs.SendCacheIP(cacheServer);
                }
            }
            ShowServers();
            string   priorityString     = priority.ToString();
            MetaData registerResponceMD = new MetaData(MetaData.Roles.dispatcher, MetaData.Actions.register, MetaData.ContentTypes.plainText, priorityString);

            tcpListener.Send(endpoint, priorityString, registerResponceMD);
            priority++; //todo: менять приоритет
        }
示例#2
0
        void handleRequest(IPEndPoint endpoint, MetaData md, string msg)
        {
            MetaData.Roles role = md.Role;

            switch (role)
            {
            case MetaData.Roles.cache:
                register(endpoint, MetaData.Roles.cache);
                break;

            case MetaData.Roles.server:
                register(endpoint, MetaData.Roles.server);
                break;

            case MetaData.Roles.client:
                pickServerForClient(endpoint);
                break;
            }
        }
示例#3
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;
            }
        }
示例#4
0
 public DispatcherClient(MetaData.Roles role)
 {
     this.role = role;
 }
示例#5
0
 public DispatcherClient(MetaData.Roles role)
 {
     this.role = role;
 }