Ejemplo n.º 1
0
 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;
     }
 }
Ejemplo n.º 2
0
        ///запус потока
        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 = "Прервано соединение с сервером реферирования. Закройте то окно."));
            }

        }
Ejemplo n.º 3
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;
            }
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        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();
            }

        }
Ejemplo n.º 6
0
        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();
            
        }
Ejemplo n.º 7
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: менять приоритет
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
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;
            }
        }