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: менять приоритет }
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; } }
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; } }
public DispatcherClient(MetaData.Roles role) { this.role = role; }