apsy
Зарегистрирован: 01.10.2007 Сообщения: 1
|
Добавлено: Пн Окт 01 2007 06:23 Заголовок сообщения: С#. Удалённое взаимодействие. Делегаты. |
|
|
Вобщем есть сервер
public delegate void DD();
public class SERVER : System.MarshalByRefObject
{
public event DD eDD;
public void FF()
{
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SERVER),
"server", WellKnownObjectMode.Singleton);
TcpServerChannel tsc = new TcpServerChannel(1111);
ChannelServices.RegisterChannel(tsc);
}
public void SS() {}
}
И есть соответственно клиент
public class CLIENT
{
private static TcpClientChannel channel;
private static SERVER serverObject;
public static void RegClient(string server, string port)
{
channel = new TcpClientChannel();
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownClientType(typeof(SERVER),
"tcp://10,10,10,10:1111/server");
serverObject = new SERVER();
}
}
Вобщем, всё нормально работает, клиент нормально вызывает методы сервета ,
т. е. serverObject.SS() нормально обрабатывается
Если же в клиенте написать serverObject.eDD += new DD(M); т. е.
попыталься подписаться на событие (М - соотв. метод клиента), то
при компиляции выскочит иксэпшн содержания "тип client не помечен как
сериализуемый"
Короче, вопрос: Как подписаться на события на удаленном объекте? |
|
vir
Зарегистрирован: 17.05.2007 Сообщения: 24
|
Добавлено: Вт Окт 16 2007 14:51 Заголовок сообщения: |
|
|
1) Сервер может слушать события клиента:
* на клиенте вешается обработчик события, который дёргает соответствующий метод сервера
2) Возможно 2 варианта
2.1)
а) Клиент при соединении узнаёт свой ай-пи аддрес, берёт свободный порт и кидает эту инфу серверу
б) Сервер подключается к клиенту (обмен ролями в некоторой степени)
в) См. п (1)
2.2) Можно по таймеру дёргать фиксированный метод сервера в надежде что он вернёт true. После этого выполнять обработчик и вызывать метод сервера, говоря, что обработка завершена. |
|