Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> глюки с сообщениями, не обрабатываются 
:(
    Опции темы
Alexsar
Дата 1.10.2006, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



Есть проблема
пишу расперделённое приложение, проблема заключется в следущем, при вызове делегатов удалённого объекта не у всех клиентов срабатывают обработчики. Почти всегда клиент потом просто висит(если это виндовозовская форма), если простое консольное приложение, то в случае 2 клиентов работает всё почти нормально, а вот когда больше клиентов начинаюся неприятности

вот код, он практически идентичен, написанному в известной книге

сервер:

Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Collections.Specialized;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            ListDictionary channelProperties = new ListDictionary();
            channelProperties.Add("port", 4000);
            BinaryServerFormatterSinkProvider serverSinkProvider = new BinaryServerFormatterSinkProvider();

             serverSinkProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

            TcpChannel channel = new TcpChannel(channelProperties, null, serverSinkProvider);
            ChannelServices.RegisterChannel(channel);

            RemotingConfiguration.RegisterWellKnownServiceType(typeof(Messager), "Messager",
            WellKnownObjectMode.Singleton);

            Messager msg = new Messager();
            ObjRef obj = RemotingServices.Marshal(msg, "TcpService");
            Console.WriteLine("Input Enter to exit..");
            Console.ReadLine();
         }
    }
}



удалённый объект:

Код

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Remoting;
using System.Windows.Forms;

public delegate void MsgEventHandler(string msg);

public interface IServer
{
    event MsgEventHandler MsgEvent;
    void Notify(string msg);
}
public class Messager : MarshalByRefObject, IServer
{
    public event MsgEventHandler MsgEvent;

    public override object InitializeLifetimeService()
    {
        return null;
    }

    public void Notify(string msg)
    {
        System.Delegate[] invkList = MsgEvent.GetInvocationList();
        IEnumerator ie = invkList.GetEnumerator();

        while (ie.MoveNext())
        {
            
            MsgEventHandler handler = (MsgEventHandler)ie.Current;
            try
            {
                handler.Invoke(msg);
                //может стоит использовать BeginInvoke, только не знаю какие параметры:( 
            }
            catch (Exception e)
            {
                MsgEvent -= handler;
            }
        }
    }
}

public class MessagerRepeater : MarshalByRefObject
{
    public event MsgEventHandler MsgEvent;
    public void Handler(string msg)
    {
        if (MsgEvent != null)
        {
            MsgEvent(msg);
        }
    }
    public override object InitializeLifetimeService()
    {
        return null;
    }
}


и сам клиент:

Код

using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System;
using System.Collections;

namespace Client
{

    class Program
    {
        public static void MessageReceived(string msg)
        {
            Console.WriteLine("Принято: "+msg);
            
        }

        static void Main(string[] args)
        {

            Hashtable props = new Hashtable();
            props.Add("port", 0);
            BinaryServerFormatterSinkProvider serverSinkProvider = new BinaryServerFormatterSinkProvider();

            serverSinkProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;


            TcpChannel channel = new TcpChannel(props, null, serverSinkProvider);
            channel.StartListening(0);
            ChannelServices.RegisterChannel(channel);

            RemotingConfiguration.RegisterWellKnownClientType(typeof(Messager), "tcp://localhost:4000/Messager");

    
            IServer m_msg = (IServer)new Messager();
            MessagerRepeater m_rep = new MessagerRepeater();
            m_msg.MsgEvent+=new MsgEventHandler(m_rep.Handler);
            m_rep.MsgEvent += new MsgEventHandler(MessageReceived);


            Console.WriteLine("Вдави exit для выхода");
            string msg;
            do
            {
                msg = Console.ReadLine();
                m_msg.Notify(msg);
            }
            while (msg != "exit");
            
            Console.ReadLine();
        }
    }
}



в чём дело не пойму, вроде всё должно работать, а почему то сообщения до некоторых клиентов не доходят, а с формами вообще страшное дело клиент-инициатор приказывает долго жить, а другие клиенты перехватывают сообщения в 50%hmmm инструмент-студия 8
ЗЫ не хочу создавать новую тему, поэтому ещё один вопрос, где можно достать информацию по сокетам и как с ними работать в С#, желательно на русском языке smile 
что я не так сделал?
PM MAIL   Вверх
Alexsar
Дата 14.10.2006, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



всем привет smile 
протестил тут консольных клиентов, оказалось что удалённый объект отключаеся через минуту-полторы, т.е. функция InitializeLifetimeService() не перегружается smile , хотя в удалённом объекте она должна гарантировать "бескнечную жизнь" удалённого объекта
в чём дело? может это надо делать через конфиг файл, но как, какие они должны быть, чтоб обеспечили эквивалентность коду?
и ещё может у кого нибудь есть примеры нормально работающих клиент-серверных приложений?
 smile 
PM MAIL   Вверх
Alexsar
Дата 22.10.2006, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



всем доброй ночи smile 
это снова я
проблему так и не устранил smile 
может у меня студия глючит?
компильните мой код(у кого есть время и желаниеsmile), и напишите как работает

а то совсем разочаруюсь ремотинге, поскольку приложения на пару минут никому не нужны smile 

ЗЫ а как на счёт конфигурационного файла?
PM MAIL   Вверх
mr.DUDA
Дата 22.10.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 2
Всего: 232



Цитата(Alexsar @  14.10.2006,  13:27 Найти цитируемый пост)
протестил тут консольных клиентов, оказалось что удалённый объект отключаеся через минуту-полторы, т.е. функция InitializeLifetimeService() не перегружается  , хотя в удалённом объекте она должна гарантировать "бескнечную жизнь" удалённого объекта

Нужно вынести InitializeLifetimeService в отдельный удалённый метод и вызывать его с клиента. Уточню, InitializeLifetimeService обязательно должен вызываться на сервере а не на клиенте.

Цитата(Alexsar @  22.10.2006,  00:12 Найти цитируемый пост)
это снова япроблему так и не устранил  может у меня студия глючит?компильните мой код(у кого есть время и желание), и напишите как работает

Про делегаты и remoting уже были вопросы, так до конца не разобрались, как именно они работают  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Alexsar
Дата 27.10.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



вопрос: как понимать следущее?
Цитата(mr.DUDA @  22.10.2006,  13:47 Найти цитируемый пост)
Нужно вынести InitializeLifetimeService в отдельный удалённый метод и вызывать его с клиента. Уточню, InitializeLifetimeService обязательно должен вызываться на сервере а не на клиенте.

так где надо вызывать?
кстати он вызывается(метод InitializeLifetimeService) но клиент глохнет
короче тёмный лес, и с ним мне предстоит возицца smile 
будем дальше копать  smile 
PM MAIL   Вверх
mr.DUDA
Дата 28.10.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 2
Всего: 232



Цитата(Alexsar @  27.10.2006,  22:50 Найти цитируемый пост)
так где надо вызывать?

Ещё раз: вызывать надо клиентом, но метод исполняться должен на сервере. Это обычный remoting-овский метод, содержащий строчку с InitializeLifetimeService().

Проверить очень просто: податтачиться к серверу и поставить брейкпоинт на InitializeLifetimeService(), если не выполнится - значит не то.


--------------------
user posted image
PM MAIL WWW   Вверх
Alexsar
Дата 6.11.2006, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: нет
Всего: 1



всем привет;)
всё полечилось, вместо Invoke надо использовать BeginInvoke(m_spik, null, this)
тока вот не всегда доходит вызов до клиента (ну где то примерно в 10% случаев), бывает с задержкой, а бывает через пару (величина не постоянная) секунд
может это сервер дурит, и имеет смысл сделать масштабирование, т.е. 1 конечная точка и пару серверов?
или может есть другой способ оптимизировать работу приложения?
т.е. что б сообщения гарантированно доходили до клиента пусть даже с незначительной задержкой.
буду оч рад совету   smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1042 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.