c # удаленные события - PullRequest
       16

c # удаленные события

1 голос
/ 16 марта 2011

Я пытаюсь создать серверное клиентское приложение, чтобы узнать больше об удаленных программах с использованием c #.

Структура довольно проста.

У меня есть сервер, который вызывает событие, когдаВызывается функция updateInventory, и каждый клиент регистрирует функцию на событие (используя делегата).

Таким образом, когда любой клиент обновляет инвентарь (вызывая функцию updateInventory), все клиенты получают предупреждение об этом посредством события.

Теперь проблема в том, что он просто не работает, когда клиент вызывает функцию updateInventory, а функция на сервере не вызывается.

Программа имеет следующие 4 компонента:

inventoryChangedArgs

, который является Сериализуемым и служит аргументом для функции, вызванной событием.Я скомпилировал его в .dll и использовал на сервере и клиенте «добавить ссылку ...»:

using System;

[Serializable]
public class InventoryChangeArgs:EventArgs
{
    private string pno;
    public string Pno
    {
        get
        {
            return pno;
        }
        set
        {
            pno = value;
        }
    }
    private int change;
    public int Change
    {
        get
        {
            return change;
        }
        set
        {
            change = value;
        }
    }
    public InventoryChangeArgs(string pno, int change)
    {
        Console.WriteLine("InventoryChangeArgs constructed");
        this.pno = pno;
        this.change = change;
    }

}

InventoryManager

, который объявляет делегата, событие и состояния, когда вызвать событие.Клиентская сторона имеет тот же класс, с той лишь разницей, что содержимое UpdateInventory является нулевым ... все остальное одинаково.

public class InventoryManager:MarshalByRefObject
{
    public delegate string InventoryChangeHandler(object sender, InventoryChangeArgs info);
    public event InventoryChangeHandler Changed;
    public void UpdateInventory(string pno, int change)
    {
        Console.WriteLine("UpdateInveroty has been invoced");
        if (change == 0)
            Console.WriteLine("No changed event");
        else if (Changed != null)
        {
            Changed(this, new InventoryChangeArgs(pno, change));
            Console.WriteLine("Changed event");
        }
    }
}

Функция события на стороне клиента Добавляетк событию функция Wan и устанавливает Remoting Configuration:

class Client
{
    static void Warn(object sender,InventoryChangeArgs args)
    {
        Console.WriteLine("It was changed by: {0] the {1}",args.Change,args.Pno);
    }
    static void Main(string[] args)
    {
        RemotingConfiguration.Configure("Client.exe.config",false);
        InventoryManager inv=new InventoryManager();
        inv.Changed+=new InventoryManager.InventoryChangeHandler(Warn);
        Console.WriteLine("Client started");
        inv.UpdateInventory("102", 2);
        Console.ReadLine();
    }
}

Удаленный файл конфигурации Это удаленный файл конфигурации для клиента, сервер почти такой же, за исключениемследующие строки:

...
<application name="Server">
      <service>
        <wellknown
          mode="Singleton"
          type="InventoryManager, InventoryManager"
          objectUri="InventoryManager" />
      </service>
    ...
<channel ref="tcp" port="9000">

...

<configuration>
  <system.runtime.remoting>
    <application>
      <client>
        <wellknown
          type="InventoryManager, InventoryManager"
          url="tcp://localhost:9000/Server/InventoryManager"
        />
      </client>
      <channels>
        <channel ref="tcp" port="0">
          <serverProviders>
            <formatter ref="binary" typeFilterLevel="Full" />
          </serverProviders>
        </channel>
      </channels>
    </application>
  </system.runtime.remoting>
</configuration>

Если бы кто-нибудь мог мне помочь, я был бы очень признателен.Заранее спасибо

...