簡體   English   中英

C#遠程事件

[英]c# remote events

我正在嘗試做一個服務器客戶端應用程序,以了解有關使用c#的遠程程序的更多信息。

結構很簡單。

我有一個服務器,當調用updateInventory函數並且每個客戶端(使用委托)向事件注冊一個函數時,該服務器都會觸發事件。

因此,當任何一個客戶端更新清單時(通過調用updateInventory函數),所有客戶端都會通過事件的方式對其進行警告。

現在的問題是它根本無法正常工作,當客戶端調用updateInventory函數時,服務器中的那個不會被喚醒。

該程序具有以下4個組件:

庫存變化的Args

它是可序列化的,並且用作事件觸發的函數的參數。 我將其編譯為.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;
    }

}

庫存管理器

聲明委托,事件並聲明何時觸發事件。 客戶端具有相同的類,唯一不同的是UpdateInventory內容,該內容為null,其他所有內容都相同。

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函數添加到事件並設置遠程配置:

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>

如果有人可以給我一些幫助,我將不勝感激。 提前致謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM