.Net Remoting 实战之----TCP Channel(vb.net实现) - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- .Net Remoting 实战之----TCP Channel(vb.net实现) (http://www.webasp.net/article/14/13216.htm) |
| -- 作者:未知 -- 发布日期: 2004-09-19 |
| .Net Remoting 实战之----TCP Channel
1.Service.vb:继承MarshalByRefObject,当跨应用程序域边界使用类型时,类型必须是从MarshalByRefObject继承的,远程应用程序域中的应用程序首次访问MarshalByRefObject 时,会向该远程应用程序传递代理。对该代理后面的调用将封送回驻留在本地应用程序域中的对象。 Public Class Service Inherits MarshalByRefObject Public Function GetServerName() As String Return System.Environment.MachineName() End Function Public Function GetProcessID() As Integer Return System.Diagnostics.Process.GetCurrentProcess.Id End Function Public Function GetCustomer() As Customer Dim obj As New Customer obj.Name = "User" Return obj End Function End Class 2.Customer.vb:可用于网络传输的序列化对象。 _ Public Class Customer Private mName As String Private mTheadID As String Private mMachineName As String Public Sub New() mTheadID = AppDomain.CurrentDomain.GetCurrentThreadId mName = System.Environment.MachineName() End Sub Public Property Name() As String Get Return mName End Get Set(ByVal Value As String) mName = Value End Set End Property Public ReadOnly Property CreatedID() As String Get Return mTheadID End Get End Property Public ReadOnly Property CreatedMachine() As String Get Return mMachineName End Get End Property Public ReadOnly Property CurrentID() As String Get Return AppDomain.GetCurrentThreadId End Get End Property Public ReadOnly Property CurrentMachine() As String Get Return System.Environment.MachineName() End Get End Property End Class 3.ServerForm.vb:服务端,对Channel和ports进行设定 Imports System.Runtime Imports System.Runtime.Remoting Imports System.Runtime.Remoting.Channels Imports System.Runtime.Remoting.Channels.Tcp Public Class ServerForm Inherits System.Windows.Forms.Form #Region " Windows 窗体设计器生成的代码 " Public Sub New() MyBase.New() '该调用是 Windows 窗体设计器所必需的。 InitializeComponent() '在 InitializeComponent() 调用之后添加任何初始化 End Sub '窗体重写 dispose 以清理组件列表。 Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Windows 窗体设计器所必需的 Private components As System.ComponentModel.IContainer '注意: 以下过程是 Windows 窗体设计器所必需的 '可以使用 Windows 窗体设计器修改此过程。 '不要使用代码编辑器修改它。 Friend WithEvents Label1 As System.Windows.Forms.Label Private Sub InitializeComponent() Me.Label1 = New System.Windows.Forms.Label Me.SuspendLayout() ' 'Label1 ' Me.Label1.Location = New System.Drawing.Point(56, 24) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(176, 23) Me.Label1.TabIndex = 0 Me.Label1.Text = "The server host is running" ' 'ServerForm ' Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14) Me.ClientSize = New System.Drawing.Size(292, 61) Me.Controls.Add(Me.Label1) Me.Name = "ServerForm" Me.Text = "ServerForm" Me.ResumeLayout(False) End Sub #End Region Private sName As String = "server" Private sPort As String = "9999" Private Sub ServerForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Remoting.RemotingConfiguration.ApplicationName = sName ChannelServices.RegisterChannel(New Tcp.TcpServerChannel(sPort)) RemotingConfiguration.RegisterActivatedServiceType(GetType(Service.Service)) End Sub End Class 4.Form1.vb 客户端 Public Class Form1 Inherits System.Windows.Forms.Form Dim objClass As Service.Service #Region " Windows 窗体设计器生成的代码 " Public Sub New() MyBase.New() '该调用是 Windows 窗体设计器所必需的。 InitializeComponent() '在 InitializeComponent() 调用之后添加任何初始化 End Sub '窗体重写 dispose 以清理组件列表。 Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Windows 窗体设计器所必需的 Private components As System.ComponentModel.IContainer '注意: 以下过程是 Windows 窗体设计器所必需的 '可以使用 Windows 窗体设计器修改此过程。 '不要使用代码编辑器修改它。 Friend WithEvents Button1 As System.Windows.Forms.Button Friend WithEvents Label1 As System.Windows.Forms.Label Private Sub InitializeComponent() Me.Button1 = New System.Windows.Forms.Button Me.Label1 = New System.Windows.Forms.Label Me.SuspendLayout() ' 'Button1 ' Me.Button1.Font = New System.Drawing.Font("宋体", 15.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(134, Byte)) Me.Button1.Location = New System.Drawing.Point(0, 0) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(184, 48) Me.Button1.TabIndex = 0 Me.Button1.Text = "取得对象" ' 'Label1 ' Me.Label1.BackColor = System.Drawing.SystemColors.Window Me.Label1.Location = New System.Drawing.Point(0, 48) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(368, 200) Me.Label1.TabIndex = 1 Me.Label1.Text = "输出信息" ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14) Me.ClientSize = New System.Drawing.Size(368, 245) Me.Controls.Add(Me.Label1) Me.Controls.Add(Me.Button1) Me.Name = "Form1" Me.Text = "Client" Me.ResumeLayout(False) End Sub #End Region Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim output As New System.Text.StringBuilder With output .Append("Server 端") .Append(vbCrLf) .Append("服务器名: ") .Append(objClass.GetServerName) .Append(vbCrLf) .Append("进程ID: ") .Append(objClass.GetProcessID) .Append(vbCrLf) .Append(vbCrLf) .Append("Client 端") .Append(vbCrLf) .Append("服务器名: ") .Append(System.Environment.MachineName) .Append(vbCrLf) .Append("进程ID: ") .Append(System.Diagnostics.Process.GetCurrentProcess.Id.ToString) .Append(vbCrLf) Label1.Text = output.ToString End With End Sub '在load时创建远端对象 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load System.Runtime.Remoting.RemotingConfiguration.RegisterActivatedClientType( _ GetType(Service.Service), "tcp://localhost:9999/Server") objClass = New Service.Service End Sub End Class 首先运行ServerForm,开启服务端,然后再运行客户端,这样客户端就可使用远端对象了,由于采用tcp,二进制传输,速度很快! |
| webasp.net |