2016-02-18 147 views
2

我最近開始使用.Net遠程處理,並設法使用一些簡單的教程,例如構建一個用作客戶端可以訪問和使用的計算器的DLL庫(https://www.youtube.com/watch?v=Ve4AQnZ-_H0)。.Net遠程處理功能

我在尋找的理解是我如何訪問服務器上保存的當前信息。例如,如果我有在服務器上運行這個簡單的部分:

int x = 0; 

while (!Console.KeyAvailable) 
{ 
x++; 
System.Threading.Thread.Sleep(1000); 
Console.WriteLine(x); 
} 

我發現到目前爲止是內置的dll只返回一個靜態的結果,如用計算器。我希望能夠通過客戶端在任何給定的時間知道服務器上有多少x。

我不知道我是否足夠清楚,但如果需要,我會盡力解釋。

+0

.NET遠程應僅用於與舊式組件協同工作,任何新的發展應該在WCF來完成。 (請參閱[本頁]頂部的粗體文本(https://msdn.microsoft.com/en-us/library/kwdt6w2k(v = vs.100).ASPX)) –

+0

@ScottChamberlain即使WCF幾乎是不推薦使用,不應用於新的開發,除非您真的需要SOAP或僅由WCF啓用的某些特性。否則,請使用WebAPI。在這種情況下,計算器可以使用服務器並請求x增加。 x可以是靜態的,並且操作可以簡單地返回全局值(儘管我不會將此置於生產中以顯示併發問題)。 – gretro

+1

@gretro meh,我說WCF和WebAPI共存。一個對一些東西有好處,一個對其他東西有好處。兩者都不能取代另一個。 –

回答

1

在下面的服務器實現演示如何保持呼叫之間的狀態。

// this gets instantiated by clients over remoting 
public class Server:MarshalByRefObject 
{ 
    // server wide state 
    public static int Value; 

    // state only for this instance (that can be shared with several clients 
    // depending on its activation model) 
    private StringBuilder buildup; 

    // an instance 
    public Server() 
    { 
     buildup = new StringBuilder(); 
     Console.WriteLine("server started"); 
    } 

    // do something useful 
    public int DoWork(char ch) 
    { 
     Console.WriteLine("server received {0}", ch); 
     buildup.Append(ch); 
     return Value; 
    } 

    // return all typed chars 
    public string GetMessage() 
    { 
     Console.WriteLine("server GetMessage called") ; 
     return buildup.ToString(); 
    } 

    // how long should this instance live 
    public override object InitializeLifetimeService() 
    { 
     // run forever 
     return null; 
    } 
} 

注意覆蓋InitializeLifetimeService。如果你不控制這個,你的實例將在5分鐘後被刪除。

要使用上述類,我們使用以下代碼來啓動並運行偵聽器,其中包括一些邏輯。不要忘記添加對組件System.Runtime.Remoting的引用。

static void Main(string[] args) 
{ 
    // which port 
    var chn = new HttpChannel(1234); 
    ChannelServices.RegisterChannel(chn, false); 

    // Create only ONE Server instance 
    RemotingConfiguration.RegisterWellKnownServiceType(
     typeof(Server), "server", WellKnownObjectMode.Singleton); 

    Server.Value = 0; 
    while (!Console.KeyAvailable) 
    { 
     Server.Value++; 
     System.Threading.Thread.Sleep(1000); 
     Console.WriteLine(Server.Value); 
    } 
} 

當這段代碼運行時,它應該監聽端口1234上的本地盒子進行連接。首次運行時,我必須禁用防火牆,允許該端口通過本地防火牆。

使用Server的客戶端實現可能如下所示。不要忘記添加對組件System.Runtime.Remoting的引用。

static void Main(string[] args) 
{ 
    var chn = new HttpChannel(); 
    ChannelServices.RegisterChannel(chn, false); 

    RemotingConfiguration.RegisterWellKnownClientType(
     typeof(Server), 
     "http://localhost:1234/server"); 

    Console.WriteLine("Creating server..."); 
    var s = new Server(); 

    Console.WriteLine("type chars, press p to print, press x to stop"); 
    var ch = Console.ReadKey(); 
    while(ch.KeyChar != 'x') 
    { 

     switch(ch.KeyChar) 
     { 
      case 'p': 
       Console.WriteLine("msg: {0}", s.GetMessage()); 
       break; 
      default: 
       Console.WriteLine("Got value {0} ", s.DoWork(ch.KeyChar)); 
       break; 
     } 

      ch = Console.ReadKey(); 
    } 
    Console.WriteLine("stopped"); 
} 

如果你編譯並運行此您的結果可能是這樣的:

demo of client and server with remoting