remoting

原文地址:http://blog.csdn.net/chengking/archive/2005/10/26/517349.aspx

(一).說明
??? 一個遠程調用示例.
??? 此示例實現功能: 客房端調用遠程方法(遠程方法可以彈??? 出自定義信息),實現發送信息功能.
??? 實現原理概是這樣的:客戶端不能直接調用遠程對象,它必須先通過信道請求服務端宿主程序,當收到客戶端請求時,
??? .net遠程處理框架會在宿主組件的應用程序域中生成所需要的遠程對象. 并執行遠程對象中的方法.????
(二).實現方案
在之前先介紹幾種類:
??? 1.可序列化的類: 以<serializable>屬性為標記,可以在進程/應用程序/計算機之間傳送.
??? 2.可遠程調用的類: 直接或間接地繼承 System.MarshalByRefObject類,可以被遠程激活.
??? 3.一般類:???????? 不能構建分布式,用于本地調用.
1.首先建立三個項目:
??? RemoteObject: 提供遠程對象,供客戶端調用
??? SimpleClient: 用于向服務端程序發出請求,調用遠程對象 (winform)
??? SimpleServer: 偵聽客戶端請求,并創建對象???????????? (winform)
2.在RemoteObject項目下面建立遠程調用類: RemoteObject.cs
??? 在SimpleClient項目下面建立: Form1.cs和SimpleClient.exe.config配置文件。
????????? 其中配置文件的作用是指定服務端地址和信道等信息,下面的代碼里面有詳細說明.
??? 在SimpleServer項目下面建立: Form1.cs和SimpleServer.exe.config配置文件。
????????? 其中配置文件的作用是指定接受請求客戶端的地址和信道等信息,下面的代碼里面有詳細說明.
(三).
各文件源代碼:
1.RemoteObject.cs
??? using System;
??? using System.Windows.Forms;
??? namespace RemoteObjects
??? {
public class RemoteObject : System.MarshalByRefObject //繼承此類才能被遠程激活調用
{
?? public RemoteObject()
?? {
?? }
??
?? //遠程調用方法,功能: 彈出自定義消息, 參數: str是從客戶端傳遞過來的
?? public static void Method(string str)
?? {???
?????????????????? MessageBox.Show(str);???
?? }??
}
??? }
2.客戶端工程SimpleClient項目中的Form1.cs:
??? using System;
??? using System.Drawing;
??? using System.Collections;
??? using System.ComponentModel;
??? using System.Windows.Forms;
??? using System.Data;
??? using RemoteObjects;
??? namespace SimpleClient
??? {
public class Form1 : System.Windows.Forms.Form
{
?? private System.Windows.Forms.TextBox textBox1;
?? private System.Windows.Forms.Label label1;
?? private System.Windows.Forms.Button button1;??
?? private System.ComponentModel.Container components = null;

?? public Form1()
?? {???
??? InitializeComponent();
?? }??
?? protected override void Dispose( bool disposing )
?? {
??? if( disposing )
??? {
???? if (components != null)
???? {
????? components.Dispose();
???? }
??? }
??? base.Dispose( disposing );
?? }

?? #region Windows 窗體設計器生成的代碼
?? /// <summary>
?? /// 設計器支持所需的方法 - 不要使用代碼編輯器修改
?? /// 此方法的內容。
?? /// </summary>
?? private void InitializeComponent()
?? {
??? this.textBox1 = new System.Windows.Forms.TextBox();
??? this.label1 = new System.Windows.Forms.Label();
??? this.button1 = new System.Windows.Forms.Button();
??? this.SuspendLayout();
??? //
??? // textBox1
??? //
??? this.textBox1.Location = new System.Drawing.Point(40, 88);
??? this.textBox1.Multiline = true;
??? this.textBox1.Name = "textBox1";
??? this.textBox1.Size = new System.Drawing.Size(336, 176);
??? this.textBox1.TabIndex = 0;
??? this.textBox1.Text = "";
??? //
??? // label1
??? //
??? this.label1.Location = new System.Drawing.Point(40, 32);
??? this.label1.Name = "label1";
??? this.label1.TabIndex = 1;
??? this.label1.Text = "請輸入信息:";
??? //
??? // button1
??? //
??? this.button1.Location = new System.Drawing.Point(296, 32);
??? this.button1.Name = "button1";
??? this.button1.TabIndex = 2;
??? this.button1.Text = "發送";
??? this.button1.Click += new System.EventHandler(this.button1_Click);
??? //
??? // Form1
??? //
??? this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
??? this.ClientSize = new System.Drawing.Size(416, 302);
??? this.Controls.Add(this.button1);
??? this.Controls.Add(this.label1);
??? this.Controls.Add(this.textBox1);
??? this.Name = "Form1";
??? this.Text = "發送信息";
??? this.Load += new System.EventHandler(this.Form1_Load);
??? this.ResumeLayout(false);

?? }
?? #endregion
??
?? [STAThread]
?? static void Main()
?? {
??? Application.Run(new Form1());???
?? }
??
?? private void Form1_Load(object sender, System.EventArgs e)
?? {
????? //載入信道,用于偵聽客戶端請求,配置文件記載客戶端地址等信息.
??? System.Runtime.Remoting.RemotingConfiguration.Configure("Simpleclient.exe.config");???
?? }

?? private void button1_Click(object sender, System.EventArgs e)
?? {
??? //開始調用遠程對象(發送信息)
??? RemoteObjects.RemoteObject.Method(this.textBox1.Text);
?? }
}
??? }
3.客戶端工程SimpleClient項目中的SimpleClient.exe.config:
?? <?xml version="1.0" encoding="utf-8" ?>
?? <configuration>
<system.runtime.remoting>
?? <application name="simpleclient">
??? <!-- 指定請求的服務端地址和端口號-->
??? <!-- url中的:localhost是測試的本機,可以使用Intenet上的其它機器名或ip地址-->
??? <client url="tcp://localhost:8080/simpleserver">
???? <activated type="RemoteObjects.RemoteObject,RemoteObjects">
???? </activated>
??? </client>
??? <channels>
???? <!-- 指定信道,有兩種信道可選:Tcp(基于TCP協議)和Http(無連續連接協議)信道-->
???? <channel ref="tcp client"/>??
??? </channels>
?? </application>
</system.runtime.remoting>
??? </configuration>
4.服務端工程SimpleServer項目中的Form1.cs:
?? using System;
?? using System.Drawing;
?? using System.Collections;
?? using System.ComponentModel;
?? using System.Windows.Forms;
?? using System.Data;
?? using System.Runtime.Remoting;

?? namespace SimpleServer
?? {
/// <summary>
/// Form1 的摘要說明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
?? /// <summary>
?? /// 必需的設計器變量。
?? /// </summary>
?? private System.ComponentModel.Container components = null;

?? public Form1()
?? {
??? //
??? // Windows 窗體設計器支持所必需的
??? //
??? InitializeComponent();

??? //
??? // TODO: 在 InitializeComponent 調用后添加任何構造函數代碼
??? //
?? }

?? /// <summary>
?? /// 清理所有正在使用的資源。
?? /// </summary>
?? protected override void Dispose( bool disposing )
?? {
??? if( disposing )
??? {
???? if (components != null)
???? {
????? components.Dispose();
???? }
??? }
??? base.Dispose( disposing );
?? }

?? #region Windows 窗體設計器生成的代碼
?? /// <summary>
?? /// 設計器支持所需的方法 - 不要使用代碼編輯器修改
?? /// 此方法的內容。
?? /// </summary>
?? private void InitializeComponent()
?? {
??? //
??? // Form1
??? //
??? this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
??? this.ClientSize = new System.Drawing.Size(292, 266);
??? this.Name = "Form1";
??? this.Text = "Form1";
??? this.Load += new System.EventHandler(this.Form1_Load);

?? }
?? #endregion

?? /// <summary>
?? /// 應用程序的主入口點。
?? /// </summary>
?? [STAThread]
?? static void Main()
?? {
??? //Application.Run(new Form1());???
??? Run();
?? }

?? private static void Run()
?? {
??? System.Runtime.Remoting.RemotingConfiguration.Configure("SimpleServer.exe.config");
?? }

?? private void Form1_Load(object sender, System.EventArgs e)
?? {
???
?? }
?? }
??? }
5.服務端工程SimpleServer項目中的SimpleServer.exe.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
?? <application name="simpleserver">
??? <service>
???? <activated type="RemoteObjects.RemoteObject,RemoteObjects">
???? </activated>
??? </service>
??? <channels>
???? <channel ref="tcp server" port="8080" />
??? </channels>
?? </application>
</system.runtime.remoting>
</configuration>
(四).注意點
?? 1.由于配置文件默認是添加在根目錄下的,要把兩個配置文件拷貝到:根目錄/bin/debug下面,要讓它與執行文件在同一個目錄下面。
?? 2.右擊RemoteObject項目,選“常規”下的,輸入類型為:“類庫”. 它默認為應用程序,這里作為類庫使用.
???? 設置好后,按: Ctrl+Shift+B生成類庫Dll.
?? 3.在工程SimpleServer和SimpleClient中分別添加引用: 即將RemoteObject項目剛生成的DLL: RemoteObjects.dll添加到各自的工程中.
???? 具體方法:右擊“引用“->”添加引用“->"瀏覽",找到生成的RemoteObjects.dll分別添加進來.
?? 4.右擊解決方案,選擇“屬性”-> “選中多啟動項目單選框”->"選SimpleServer和SimpleClient同時啟動".
???? 因為: 當服務端宿主程序運行時,客戶端才能正確調用遠程對象.
?? 5.按F5運行. 輸入信息,點“發送”按鈕,就可以調用遠程對象了.
(五).擴展
???? 可以修改客戶端配置文件:<client url="tcp://localhost:8080/simpleserver"> 中的localhost為其它的機器名稱,只要另一臺
???? 機器運行了宿主程序,并處于運行狀態. 那么當調用時,會在服務端彈出信息,即實現了發送信息功能.

?

以上代碼已經測試,不正確的地方望批評指正!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389104.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

handler 消息處理機制

關于handler消息處理機制&#xff0c;只要一提到&#xff0c;相信作為一個android工程師&#xff0c;腦海就會有這么一個流程 大家都滾瓜爛熟了&#xff0c;但別人問到幾個問題&#xff0c;很多人還是栽到這個“爛”上面&#xff0c;比如&#xff1a; 一個線程是如何對應一個L…

es6簡單介紹

let和const 原先聲明變量的形式 var test 5; //全局變量 function a() {var cc3; //局部變量alert(test); } function b(){alert(test);}test 5;//全局變量 function a() {aa3; //全局變量alert(test); } 在es6之前&#xff0c;作用域只有全局作用域和函數作用域&#xff0…

軟件工程方法學要素含義_日期時間數據的要素工程

軟件工程方法學要素含義According to Wikipedia, feature engineering refers to the process of using domain knowledge to extract features from raw data via data mining techniques. These features can then be used to improve the performance of machine learning a…

洛谷P1605:迷宮(DFS)

題目背景 迷宮 【問題描述】 給定一個N*M方格的迷宮&#xff0c;迷宮里有T處障礙&#xff0c;障礙處不可通過。給定起點坐標和終點坐標&#xff0c;問: 每個方格最多經過1次&#xff0c;有多少種從起點坐標到終點坐標的方案。在迷宮中移動有上下左右四種方式&#xff0c;每次只…

vue圖片壓縮不失真_圖片壓縮會失真?快試試這幾個無損壓縮神器。

前端通常在做網頁的時候 會出現圖片加載慢的情況 在這里我通常會將圖片進行壓縮 但是通常情況下 觀眾會認為 圖片壓縮會出現失真的現象 在這里我會向大家推薦幾款圖片壓縮的工具 基本上會實現無損壓縮1.TinyPng地址&#xff1a;https://tinypng.comEnglish&#xff1f;不要慌&a…

remoteing2

此示例主要演示了net remoting,其中包含一個服務器程序Server.exe和一個客戶端程序CAOClient.exe。客戶端程序會通過http channel調用服務器端RemoteType.dll的對象和方法。服務器端的代碼文件由下圖所述&#xff1a;Server.cs源代碼 :using System;using System.Runtime.Remot…

android 線程池

為什么用線程池 創建/銷毀線程伴隨著系統開銷&#xff0c;過于頻繁的創建/銷毀線程&#xff0c;會很大程度上影響處理效率 例如&#xff1a; 記創建線程消耗時間T1&#xff0c;執行任務消耗時間T2&#xff0c;銷毀線程消耗時間T3 如果T1T3>T2&#xff0c;那么是不是說開…

datatable轉化泛型

public class ConvertHelper<T>where T:new() { /// <summary> /// 利用反射和泛型 /// </summary> /// <param name"dt"></param> /// <returns></returns> public static List<T> ConvertToList(DataTable dt) { …

【躍遷之路】【651天】程序員高效學習方法論探索系列(實驗階段408-2018.11.24)...

(收集箱&#xff08;每日一記&#xff0c;每周六整理&#xff09;)專欄 實驗說明 從2017.10.6起&#xff0c;開啟這個系列&#xff0c;目標只有一個&#xff1a;探索新的學習方法&#xff0c;實現躍遷式成長實驗期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我將以自己…

更換mysql_Docker搭建MySQL主從復制

Docker搭建MySQL主從復制 主從服務器上分別安裝Docker 1.1 Docker 要求 CentOS 系統的內核版本高于 3.10 [rootlocalhost ~]# uname -r 3.10.0-693.el7.x86_641.2 確保 yum 包更新到最新。 [rootlocalhost ~]# sudo yum update Loaded plugins: fastestmirror, langpacks Loadi…

dll文件的c++制作dll文件的c++制作

dll文件的c制作1、首先用vs2005建立一個c的dll動態鏈接庫文件&#xff0c;這時&#xff0c;// DllTest.cpp : 定義 DLL 應用程序的入口點。//#include "stdafx.h"//#include "DllTest.h"#ifdef _MANAGED#pragma managed(push, off)#endifBOOL APIENTRY Dll…

理解ConstraintLayout 對性能的好處

自從在17年GoogleI/O大會宣布了Constraintlayout,我們持續提升了布局的穩定性和布局編輯的支持。我們還為ConstraintLayout添加了一些新特性支持創建不同類型的布局&#xff0c;添加這些新特性&#xff0c;可以明顯的提升性能&#xff0c;在這里&#xff0c;我門將討論Contrain…

數據湖 data lake_在Data Lake中高效更新TB級數據的模式

數據湖 data lakeGOAL: This post discusses SQL “UPDATE” statement equivalent for a data lake (object) storage using Apache Spark execution engine. To further clarify consider this, when you need to perform conditional updates to a massive table in a relat…

如何理解運維

運維工程師&#xff08;運營&#xff09;&#xff0c;負責維護并確保整個服務的高可用性&#xff0c;同時不斷優化系統架構提升部署效率&#xff0c;優化資源利用率提高整體的投資回報率。運維工程師面對的最大挑戰是大規模集群的管理問題&#xff0c;如何管理好幾十萬臺服務器…

advanced installer更換程序id_好程序員web前端培訓分享kbone高級-事件系統

好程序員web前端培訓分享kbone高級-事件系統&#xff1a;1、用法&#xff0c;對于多頁面的應用&#xff0c;在 Web 端可以直接通過 a 標簽或者 location 對象進行跳轉&#xff0c;但是在小程序中則行不通&#xff1b;同時 Web 端的頁面 url 實現和小程序頁面路由也是完全不一樣…

ai對話機器人實現方案_顯然地引入了AI —無代碼機器學習解決方案

ai對話機器人實現方案A couple of folks from Obviously.ai contacted me a few days back to introduce their service — a completely no-code machine learning automation tool. I was a bit skeptical at first, as I always am with supposedly fully-automated solutio…

網絡負載平衡的

網絡負載平衡允許你將傳入的請求傳播到最多達32臺的服務器上&#xff0c;即可以使用最多32臺服務器共同分擔對外的網絡請求服務。網絡負載平衡技術保證即使是在負載很重的情況下它們也能作出快速響應。 網絡負載平衡對外只須提供一個IP地址&#xff08;或域名&#xff09;。 如…

透明狀態欄導致windowSoftInputMode:adjustResize失效問題

當我們通過下面代碼&#xff1a; getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 設置狀態欄透明&#xff0c;當界面存在EditText時&#xff0c;在activity里面設置windowSoftInputMode:…

[TimLinux] JavaScript 元素動態顯示

1. css的opacity屬性 這個屬性用于&#xff1a;設置元素的不透明級別&#xff0c;取值范圍&#xff1a;從 0.0 &#xff08;完全透明&#xff09;到 1.0&#xff08;完全不透明&#xff09;&#xff0c;元素所在的文本流還在。這個屬性的動態變化可以用來設置元素的淡入淡出效果…

神經網絡 CNN

# encodingutf-8import tensorflow as tfimport numpy as npfrom tensorflow.examples.tutorials.mnist import input_datamnist input_data.read_data_sets(MNIST_data, one_hotTrue)def weight_variable(shape): initial tf.truncated_normal(shape, stddev0.1) # 定義…