void ping() { bool flag = true; MetaData pingPackage = new MetaData(MetaData.Roles.none, MetaData.Actions.ping); try { while (flag) { this.Send("", pingPackage); Thread.Sleep(300); } } catch (ThreadAbortException) { flag = false; onDisconnect = null; //return; } catch (SocketException) { if(onDisconnect != null) { onDisconnect(); } return; } }
///запус потока private void threadForRef_start(byte compressPercent) { textBlock.Dispatcher.Invoke(new Action(() => textBlock.Text = "Статья на сжатии...")); button.Dispatcher.Invoke(new Action(() => button.Visibility = System.Windows.Visibility.Hidden)); int port = Int32.Parse(ConfigurationManager.AppSettings["refServerPort"].ToString()); TCPClient refSever = null; try { refSever = new TCPClient(refServIP, port); } catch { } if(refSever != null) { string url = URL; string message = url + "|" + compressPercent; MetaData md = new MetaData(MetaData.Roles.client, MetaData.Actions.refNews, MetaData.ContentTypes.link, message); refSever.Send(message, md); string response = refSever.ReceiveSyncData(0); textBlock.Dispatcher.Invoke(new Action(() => textBlock.Text = response)); button.Dispatcher.Invoke(new Action(() => button.Visibility = System.Windows.Visibility.Visible)); } else { textBlock.Dispatcher.Invoke(new Action(() => textBlock.Text = "Прервано соединение с сервером реферирования. Закройте то окно.")); } }
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; } }
/// <summary> /// Отправка сообщения клиенту /// </summary> /// <param name="endpoint"></param> /// <param name="msg">Пересылаемое сообщение</param> public void Send(IPEndPoint endpoint, string msg, MetaData md) { TcpClient client = clients[endpoint]; MemoryStream ms = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, md); byte[] msgBytes = md.Encoding.GetBytes(msg); ms.Write(msgBytes, 0, msgBytes.Length); byte[] generalMsg = new byte[ms.Length]; ms.Position = 0; ms.Read(generalMsg, 0, (int)ms.Length); NetworkStream socketStream = client.GetStream(); socketStream.Write(generalMsg, 0, generalMsg.Length); }
public void Send(string msg, MetaData md) { try { NetworkStream socketStream = client.GetStream(); MemoryStream ms = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, md); byte[] msgBytes = md.Encoding.GetBytes(msg); ms.Write(msgBytes, 0, msgBytes.Length); byte[] generalMsg = new byte[ms.Length]; ms.Position = 0; ms.Read(generalMsg, 0, (int)ms.Length); socketStream.Write(generalMsg, 0, generalMsg.Length); } catch (Exception) { //SocketException se = (SocketException)e.InnerException; //if (se.ErrorCode == 10053 && se.ErrorCode == 10054) //{ if (onDisconnect != null) { //onDisconnect(); } //} throw new SocketException(); } }
private void btnReferate_Click(object sender, RoutedEventArgs e) { if (lvArticles.SelectedIndex < 0) { MessageBox.Show("выберите статью"); return; } try { string url = rssChanels[cmbCategoryList.SelectedIndex].Articles[lvArticles.SelectedIndex].link; MetaData md = new MetaData(MetaData.Roles.client, MetaData.Actions.refNews); int port = Int32.Parse(ConfigurationManager.AppSettings["dispatcherTCPport"].ToString()); dispComponent = new TCPClient(ipDispatcher, port); dispComponent.Send("", md); string response = dispComponent.ReceiveSyncData(0); if (response == "0000") { MessageBox.Show("В данный момент эта опция не доступна. Пожалуйста, обратитесь к администратору."); return; } ReferateView winRef = new ReferateView(url, response); winRef.Show(); } catch (Exception) { MessageBox.Show("Нет подключения к диспетчеру. Идет повторный поиск диспетера."); broadCast.Start(); } //ReferateView winRef = new ReferateView(); }
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 pickServerForClient(IPEndPoint client) { if (servers.Count == 0) // если серверов для реферирования нет { MetaData metaData = new MetaData(MetaData.Roles.server, MetaData.Actions.none, MetaData.ContentTypes.error, "0000"); tcpListener.Send(client, "0000", metaData); return; } string refServIP = servers[NextServIndex].EndPoint.Address.ToString(); MetaData md = new MetaData(MetaData.Roles.server, MetaData.Actions.none, MetaData.ContentTypes.link, refServIP); tcpListener.Send(client, refServIP, md); }
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; } }