.Net 3.5 Remoting编程入门三
VS2008 .Net 3.5 Remoting編程入門三
信道
什么是信道?信道有哪些類型呢?
信道顧名思意就是通信的通道。就想那些宣傳標語說的,“要想富,先修路!”。同理,要學習Remoting,當然要學習信道了。
.NET Framework 遠程處理基礎結構提供下列信道實現:
IpcChannel
TcpChannel
HttpChannel
IpcChannel
IpcChannel 類使用命名管道為同一臺計算機上的多進程應用程序提供高速進程間通信。IpcChannel 執行下列功能:
使用命名管道在發送方和接收方之間通信。
支持以二進制格式和行業標準 SOAP 序列化格式編碼負載。
生成并使用對象引用的 ChannelDataStore。
支持模擬和委托。
支持在命名管道上利用訪問控制列表 (ACL) 來提供高級訪問控制。
當一個應用程序必須與同一臺計算機上其他進程中運行的另一個應用程序通信時,就應當使用 IpcChannel。由于 IpcChannel 使用命名管道,因此應用程序通常能夠獲得最高的通信性能,并可以使用模擬和委托來控制對遠程對象的訪問。對于三層應用程序而言,其第二層和第三層之間的通信必須能夠在負載下運行良好。此時,這一功能便尤其有用。
TcpChannel
TcpChannel 類使用二進制格式化程序將所有消息序列化為二進制流,并使用 TCP 協議將該流傳輸至目標統一資源標識符 (URI)。TcpChannel 執行下列功能。
使用 TCP 套接字在發送方和接收方之間通信。
支持以二進制格式和行業標準 SOAP 序列化格式編碼負載。
生成并使用對象引用的 ChannelDataStore。
支持模擬和委托。
支持 SSPI 加密。
TcpChannel 會根據該時刻向另一臺服務器發送請求的線程數打開并緩存相應數目的連接。當套接字連接的非活動時間超過 15-20 秒后,客戶端將關閉這些連接。
在生成大量使用 .NET Framework 遠程處理的應用程序時,很容易錯誤地使用 HttpChannel 連接至用 TcpChannel 進行偵聽的服務器應用程序域。如果建立了這種連接,客戶端將收到以下異常:“基礎連接已經關閉: 接收時發生錯誤”。如果您的客戶端收到此異常,則應當檢查客戶端和服務器,以確定是否存在信道不匹配的問題。
HttpChannel
HttpChannel 類使用 SOAP 協議在遠程對象之間傳輸消息。所有消息都通過 SoapFormatter 傳遞,此格式化程序會將消息轉換為 XML 并進行序列化,同時向數據流中添加所需的 SOAP 標頭。如果還指定了二進制格式化程序,則會創建二進制數據流。隨后,將使用 HTTP 協議將數據流傳輸至目標 URI。HttpChannel 符合 SOAP 1.1 標準,它執行下列功能:
通過將 HTTP 協議用作傳輸在發送方和接收方之間通信。
支持以 SOAP(一種 XML 編碼標準)和二進制格式編碼負載。
將接收方設置為通過 ASP.NET 和 TCP 套接字接收 HTTP 請求并發送 HTTP 響應。
生成并使用對象引用的 ChannelDataStore。
支持模擬和委托。
支持 SSPI 加密。
HttpChannel 一次只向給定服務器打開指定數目的連接。默認值為 2,但您可以使用應用程序配置文件中的 clientConnectionLimit 屬性更改該默認值。
在生成大量使用 .NET Framework 遠程處理的應用程序時,很容易錯誤地使用 HttpChannel 連接至用 TcpChannel 進行偵聽的服務器應用程序域。如果建立了這種連接,客戶端將收到以下異常:“基礎連接已經關閉: 接收時發生錯誤”。如果您的客戶端收到此異常,則應當檢查客戶端和服務器,以確定是否存在信道不匹配的問題。
以上摘自MSDN,已經說的很明白了。
?
每種類型的channel都有對應的clientchannel和serverchannel兩中形式。在一般情況下,我們直接使用一種類型的channel,負責接受和發送。
下面看看代碼怎么寫的。
?
遠程對象類,RemotingClass.cs和以前的一樣,不要改變。
using System;
namespace RemotingClass
{
??? public class Message : MarshalByRefObject
??? {
??????? public Guid MessageId { get; set; } //Guid,用于保存Message的ID
??????? public Message()
??????? {
??????????? this.MessageId = Guid.NewGuid();//當對象被實例同時產生一個ID
??????? }
?
??????? public delegate void MessageHandler(string msg);
??????? public static event MessageHandler OnSendMessage;
??????? public void SendMessage(string msg)
??????? {
???????????if (OnSendMessage != null)
??????????????? OnSendMessage("Message的ID是:" + this.MessageId + msg);
??????? }
??? }
}
服務端代碼:(注意看注釋的地方)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;//使用IpcChannel
//using System.Runtime.Remoting.Channels.Http;//使用HttpChannel
//using System.Runtime.Remoting.Channels.Tcp;//使用TcpChannel
?
?
namespace Server
{
??? class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? Console.WriteLine("Host Started!");
??????????? //HttpChannel channel = new HttpChannel(20001);//創建HttpChannel通道
??????????? //TcpChannel channel = new TcpChannel(20001);//創建TcpChannel通道
??????????? IpcChannel channel = new IpcChannel("localhost:20001");//創建IpcChannel通道,和http、tcp有點不一樣,其他的地方基本一樣。
?
????????? ??ChannelServices.RegisterChannel(channel, false);
??????????? RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemotingClass.Message), "Message.rem", WellKnownObjectMode.SingleCall); //這里使用SingleCall即可
??????????? RemotingClass.Message.OnSendMessage += new RemotingClass.Message.MessageHandler(Message_OnSendMessage);
??????????? Console.Read();
??????? }
??????? public static void Message_OnSendMessage(string msg)
??????? {
??????????? Console.WriteLine(msg);
??????? }
??? }
}
?
客戶端代碼:(注意看注釋的方法)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc;
//using System.Runtime.Remoting.Channels.Http;//使用HttpChannel
//using System.Runtime.Remoting.Channels.Tcp;//使用TcpChannel
?
namespace Client
{
??? class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? Console.WriteLine("Client Started!");
??????????? // HttpChannel channel = new HttpChannel();//創建HttpChannel通道
??????????? // TcpChannel channel = new TcptChannel();//創建TcpChannel通道
??????????? IpcChannel channel = new IpcChannel();//創建IpcChannel通道
??????????? ChannelServices.RegisterChannel(channel, false);
??????????? RemotingConfiguration.RegisterWellKnownClientType(typeof(RemotingClass.Message), "ipc://localhost:20001/Message.rem");
//注意此處的協議,不同的通道使用不同的協議。如果是httpchannel,則使用http,如果是tcpchannel,則請使用tcp
??????????? RemotingClass.Message msg = new RemotingClass.Message();
??????????? while (true)
??????????? {
??????????????? msg.SendMessage(" 現在是:" + System.DateTime.Now.ToString());
??????????????? System.Threading.Thread.Sleep(2000);
??????????? }
??????????? //Console.ReadLine();
??????? }
?
??? }
}
總結
以上是生活随笔為你收集整理的.Net 3.5 Remoting编程入门三的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [导入]SQL中的临时表和表变量
- 下一篇: 开发常见错误解决(1)注册.NET En