C#遠端資料存取(Remoting)

來源:互聯網
上載者:User

1、 建立一個遠程對象(DLL):建立一個解決方案(類庫),命名為RemoteObject

建立一個類 RemoteTest,代碼如下

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.SqlClient;

 

namespace RemoteObject

{

    public class RemoteTest : System.MarshalByRefObject//這是不能少的

    {

        SqlConnection con;

        DataSet ds;

        SqlDataAdapter da;

        string conStr = "data source=HEYU\\SQLEXPRESS;initial catalog=schooldatabase;integrated security=SSPI;persist security info=False;packet size=4096";

        string queryStr = "select   *   from   book";

        public DataTable datable()

        {

            using (con = new SqlConnection(conStr))

            {

                using (da = new SqlDataAdapter(queryStr, con))

                {

                    ds = new DataSet();

                    da.Fill(ds, "Categories");

 

                    return ds.Tables["Categories"];

                }

            }

        }

    }

}

 

2、建立伺服器端程式,建立一個解決方案,命名為Sever,添加引用上面編譯好的DLL

代碼如下:

using System;

using System.Windows.Forms;

using System.Runtime.Remoting;//這個要添加引用

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

//也可以改用HTTP傳輸實現

namespace Sever

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

//注意第二個參數要和用戶端的一致,可以為TRUE也可以為FALSE

            ChannelServices.RegisterChannel(new TcpServerChannel(9999), true);

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(RemoteObject.RemoteTest), "heyu", WellKnownObjectMode.Singleton);

        }

    }

}

 

3、建立伺服器端程式,建立一個解決方案,命名為Client,添加引用上面編譯好的DLL

代碼如下:

using System;

using System.Windows.Forms;

using System.Runtime;

using System.Runtime.Remoting; //這個要添加引用

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

 

namespace Client

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            ChannelServices.RegisterChannel(new TcpClientChannel(),true);

            RemoteObject.RemoteTest obj = (RemoteObject.RemoteTest)Activator.GetObject(typeof(RemoteObject.RemoteTest), "tcp://192.168.1.103:9999/heyu");

            this.dataGridView1.DataSource = obj.datable();

        }

    }

}

 

以上的程式可以說是不能夠再簡單的了,只適合於初學者!因為建立這樣的程式存在很多的缺點:

1、沒有使用設定檔,使得更改伺服器時要重新編譯器。

2、建立出來的遠程物件服務器端和用戶端的是一樣,為了代碼的安全性,且降低用戶端對遠程對象中繼資料的相關性,我們有必要對這種方式進行改動。即在伺服器端實現遠程對象,而在用戶端則刪除這些實現的中繼資料。更好的解決辦法是配合反射來處理。註冊遠程對象時,我們不要註冊類,通過定義介面,而實現過程的類又繼承這一個介面,通過類名去反射建立這一個類對象(注意是object不是class),然後通過強制類型轉換,把這個object賦給介面,這樣就可以完全的分離了!做成代理工廠。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.