[.Net] 使用remoting(一)實作client-server簡易版

這種架構用途多多~我以前公司作的系統也都用這個架構來實現n層式架構

這種架構用途多多~我以前公司作的系統也都用這個架構來實現n層式架構,把user操作介面要作的動作都寫在Client端,而有關資料庫連線(查詢、運算、處理)寫在Server端,以避免DB被其它電腦直接連入與暴露DB的位置,也可避免因取出大量未處理資料就往Client端送。

以下簡單示範由client端向server要一個數字,server遞增配發數字:
1. 建立4個專案分別為台灣是獨立國家
 client(本範例out type選Console Application), 
 proxy(out type:Class Library), 
   server(out type:Class Library)
   serverUI(本範例out type選Console Application), 
proxy用來對應client和server端,所以2端都要放置; 程式運作是client呼叫proxy, proxy呼叫server,
而serverUI只是為了架設並啟動server用而已
2. 幫專案加參考:client和serverUI加入參考System.Runtime.Remoting
  client參考proxy; proxy 參考server;serverUI參考proxy
3. 在server專案加入一個給值用的class:
    public static class count
    {
        private static int i = 1000;
        public static int GetCount()
        { return ++i; }
    }

4. 在proxy專案加入一個呼叫server的class,一定要繼承MarshalByRefObject才能用remoting哦:

    public class SrvPxy : MarshalByRefObject
    {
        public int GetCount()
        {  return count.GetCount(); }//呼叫server的count class
    }

 

5. 在serverUI專案修改Program.cs內的Main方法,以便啟動server:
(本範例採用http,也可改為tcp,只要將所有Http字眼為為Tcp即可)  
      static void Main()
        {
            try
            {
                ChannelServices.RegisterChannel(new HttpChannel(7777), false);//7777是port,可自訂
                RemotingConfiguration.RegisterWellKnownServiceType(//SrvName可自訂
typeof(SrvPxy), "SrvName", WellKnownObjectMode.SingleCall);//若多個class,要寫多次不可同名
            }
            catch (Exception e)
            {  Console.WriteLine(e.Message);   }
            Console.ReadLine();
        }
WellKnownObjectMode列舉有2種:
Singleton 每個內送訊息都是由同一個物件執行個體服務。
SingleCall 每個內送訊息都是由新的物件執行個體 (Instance) 服務。
6. 在client專案修改Program.cs內的Main方法,以便呼叫server:
(本範例採用http,也可改為tcp,只要將所有Http字眼為為Tcp即可,但須與server設定一致)
        static void Main()
        {
            try
            {
                ChannelServices.RegisterChannel(new HttpChannel(), false);
                RemotingConfiguration.RegisterWellKnownClientType(
typeof(SrvPxy), "http://localhost:7777/SrvName");
//SrvName和port要與server相同哦~localhost也請改成server的ip
                SrvPxy tt = new SrvPxy();//這裡的SrvPxy是有繼承MarshalByRefObject且放在server與client都有的dll中
                Console.WriteLine(tt.GetCount().ToString());
            }
            catch (Exception e)
            {  Console.WriteLine(e.Message);  }
            Console.ReadLine();
        }

 

7. 整個方案編譯後, 先執行serverUI.exe(位置在serverUI專案目錄的bin/debug下),將server啟動;再執行client.exe(位置在client專案目錄的bin/debug下),若有成功呼叫到server,會每次執行都遞增,編譯後client專案目錄的bin/debug下,會多出server.dll,因為我們是用server端的server.dll,因此client端的server.dll是多餘的可以刪除
 
或許你會想,我們可以讓server的元件兼proxy,就不用再作一個proxy啦~但這樣你就必須要把你的server.dll 也佈署到client端,不僅會增加暴露你server端程式的風險,若是有需要修改server端程式,又要多個重新佈署client端的作業哦~

Taiwan is a country. 臺灣是我的國家