VB.Net/Network Remote/Remote Life Time

Материал из VB Эксперт
Перейти к: навигация, поиск

Initialize Lifetime Service (bugs)

///////////////////////////////////general.vb
// Compile: vbc /target:library  general.vb
Imports System
Public Interface IRemoteObject
    Sub setValue(ByVal newval As Integer)
    Function getValue() As Integer
End Interface
Public Interface IRemoteFactory
    Overloads Function getNewInstance() As IRemoteObject
    Overloads Function getNewInstance(ByVal initvalue As Integer) As IRemoteObject
End Interface

///////////////////////////////////test.vb
// Compile: vbc /t:exe /r:general.dll test.vb
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels.Http
Imports System.Runtime.Remoting.Channels
Module Client
    Sub Main()
        Dim channel As New HttpChannel()
        ChannelServices.RegisterChannel(channel,false)
        Dim fact As IRemoteFactory = CType(Activator.GetObject( _
            GetType(IRemoteFactory), _
            "http://localhost:1234/factory.soap"), _
            IRemoteFactory)
        Dim obj1 As IRemoteObject = fact.getNewInstance()
"        System.Threading.Thread.Sleep(1000)
        Console.WriteLine("call remote method")
        Try
            obj1.setValue(42)
        Catch e As Exception
            Console.WriteLine("Client.Main(). EXCEPTION " + vbCrLf + e.Message)
        End Try
    End Sub
End Module
///////////////////////////////////server.vb
// vbc /target:exe  /r:general.dll server.vb
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels.Http
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Lifetime
Class MyRemoteObject
    Inherits MarshalByRefObject
    Implements IRemoteObject
    Private myvalue As Integer

    Public Overrides Function InitializeLifetimeService() As Object
        Dim lease As ILease = CType(MyBase.InitializeLifetimeService(), ILease)
        If lease.CurrentState = LeaseState.Initial Then
            lease.InitialLeaseTime = TimeSpan.FromMilliseconds(10)
            lease.SponsorshipTimeout = TimeSpan.FromMilliseconds(10)
            lease.RenewOnCallTime = TimeSpan.FromMilliseconds(10)
        End If
        Return lease
    End Function

    Public Sub New()
       myvalue = 0
    End Sub
    Public Sub New(ByVal startvalue As Integer)
        myvalue = startvalue
    End Sub
    Public Sub setValue(ByVal newval As Integer) _
    Implements IRemoteObject.setValue
        myvalue = newval
    End Sub
    Public Function getValue() As Integer _
    Implements IRemoteObject.getValue
        Return myvalue
    End Function
End Class
Class MyRemoteFactory
    Inherits MarshalByRefObject
    Implements IRemoteFactory
    Public Function getNewInstance() As IRemoteObject _
    Implements IRemoteFactory.getNewInstance
        Console.WriteLine("create object with no argment")
        Return New MyRemoteObject()
    End Function
    Public Function getNewInstance(ByVal initvalue As Integer) As IRemoteObject _
    Implements IRemoteFactory.getNewInstance
        Console.WriteLine("create object with argument")
        Return New MyRemoteObject(initvalue)
    End Function

End Class
Module ServerStartup
    Sub Main()
        LifetimeServices.LeaseManagerPollTime = TimeSpan.FromMilliseconds(10)
        Dim chnl As New HttpChannel(1234)
        ChannelServices.RegisterChannel(chnl,false)
        RemotingConfiguration.RegisterWellKnownServiceType( _
            GetType(MyRemoteFactory), _
            "factory.soap", _
            WellKnownObjectMode.Singleton)
        Console.WriteLine("Server started")
        Console.ReadLine()
    End Sub
End Module