.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,二進制傳輸,速度很快!
.Net Remoting 實戰之----TCP Channel(vb.net實現)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.