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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Events in Remoting 
:(
    Опции темы
mullih
Дата 11.2.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем доброго время суток
Есть простенькая програмка
Листинг
ObjServer.cs
Код

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

namespace RemoteObjectServer {
    class ObjServer {
        static void Main(string[] args) {
            Console.WriteLine("***** Server started! *****");

            BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider();
            serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

            IDictionary props = new Hashtable();
            props["port"] = 32469;

            TcpChannel c = new TcpChannel(props, null, serverProv);
            ChannelServices.RegisterChannel(c);

            // Register a 'well-known' object.
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotingAsm.RemoteMessageObject),"RemoteMsgObj.rem",WellKnownObjectMode.Singleton);

            Console.ReadLine();
        }
    }
}

ObjClient.cs
Код

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

namespace RemoteObjectClient {
    class ObjClient {
        static void Main(string[] args) {

            BinaryServerFormatterSinkProvider serverProv = new BinaryServerFormatterSinkProvider();
            serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;

            BinaryClientFormatterSinkProvider clientProv = new BinaryClientFormatterSinkProvider();

            IDictionary props = new Hashtable();
            props["port"] = 1234;

            TcpChannel c = new TcpChannel(props, clientProv, serverProv);
            ChannelServices.RegisterChannel(c);

            // Get a proxy to remote object.
            object remoteObj = Activator.GetObject(
                typeof(RemotingAsm.RemoteMessageObject),
                "tcp://localhost:32469/RemoteMsgObj.rem");

            RemotingAsm.RemoteMessageObject simple = (RemotingAsm.RemoteMessageObject)remoteObj;

            simple.RemoteEvent += simple_RemoteEvent;

            simple.DisplayMessage("Hello from the client!");
            Console.WriteLine("Server says: {0}", simple.ReturnMessage());
            Console.WriteLine("Client started!  Hit enter to end");
            Console.ReadLine();
        }

        private static void simple_RemoteEvent(object sender, EventArgs e) {
            Console.WriteLine("Event on client");
        }
    }
}

RemoteMessageObject.cs
Код

using System;

namespace RemotingAsm {
    // This is a type that will be 
    // marshaled by reference (MBR) if accessed remotely.
    [Serializable]
    public class RemoteMessageObject : MarshalByRefObject {
        public event EventHandler RemoteEvent;

        public RemoteMessageObject() {
            Console.WriteLine("Constructing RemoteMessageObject!");
        }

        // This method displays an input string 
        // from the caller.
        public void DisplayMessage(string msg) {
            Console.WriteLine("Message is: {0}", msg);
        }

        // This method returns a value to the
        // caller.
        public string ReturnMessage() {
            if (RemoteEvent != null)
                RemoteEvent.Invoke(null, EventArgs.Empty);

            return "Hello from the server!";
        }
    }
}


Проблема в том что событие выводится на консоль на стороне сервера. А почему не знаю. И как сделать чтоб событие создавалось на стороне сервера а обрабатывалось на стороне клиента
Заранее благодарен за ответ или хотябы укажите путь куда смотреть или копать надо, а в идеале было хорошо если б код в качестве примера привести
PM MAIL WWW Skype   Вверх
Crimp
Дата 12.2.2008, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не смотрел что там у тебя в коде, линк на код собранный с книги, работает на ура именно как тебе надо :)
http://www.dotsite.spb.ru/Forums/15541.aspx

а во ты забыл про делегат :)

или вот пример
на сервере, код коннекта не пишу - баян
на сервере для генегации эвента вызывается метод ReturnStatus
Код


namespace XXXXX.YYYYYY {
    public delegate void StatusEvent(object sender, StatusEventArgs e);
            public class ZZZ{
public event StatusEvent Status;
        public void ReturnStatus(CustomCommandExecutor executor) {
            StatusEventArgs clientMessage = new StatusEventArgs("Passed");
            if (executor.Exceptions.Count > 0) {
                clientMessage = new StatusEventArgs(((Exception)executor.Exceptions[0]).Message);
            }
            if (Status != null) {
                Status(this, clientMessage);
            }
        }
    }
    [Serializable]
    public class StatusEventArgs {
        public StatusEventArgs(string m) {
            message = m;
        }
        public string Message {
            get {
                return message;
            }
            set {
                message = value;
            }
        }
        private string message;
    }
    public class EventSink : MarshalByRefObject {
        protected EventSink() {
        }
        private static EventSink eventSink = null;
        public static EventSink Instance {
            get {
                if (eventSink == null) {
                    eventSink = new EventSink();
                }
                return eventSink;
            }
        }
        [OneWay]
        public void StatusHandler(object sender, StatusEventArgs e) {
            XXX.CommandStatus.Instance.Metod();
            if (e.Message != "Passed") {
                XXX.CommandStatus.Instance.ExceptionMessage = e.Message;
            }
            else {
                XXX.CommandStatus.Instance.ExceptionMessage = "";
            }
            XXX.CommandStatus.Instance.CommandExecute = false;
      }
      }
}
 

код на клиенте 
Код

                       customCommandExecutor.Status += new StatusEvent(EventSink.Instance.StatusHandler);

в результате на клиенте будет выполнен код 
                         
Код

                 public void StatusHandler(object sender, StatusEventArgs e) {
            XXX.CommandStatus.Instance.Metod();
            if (e.Message != "Passed") {
                XXX.CommandStatus.Instance.ExceptionMessage = e.Message;
            }
            else {
                XXX.CommandStatus.Instance.ExceptionMessage = "";
            }
            XXX.CommandStatus.Instance.CommandExecute = false;
        }


XXX.CommandStatus.Instance... класс синглетон методы которого мне просто удобно дергать где угодно в коде, и данные одни и теже.
если где ошипься и не всё написал извиняюсь :) выдернуто из кода. все работает нормуль

Это сообщение отредактировал(а) Crimp - 12.2.2008, 10:31
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

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

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

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


 




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


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

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