Ako prodje vise vremena, slobodno dodaj novi post.
Hajd' da probam ovako napamet, ne mogu praviti projekat sada.
Ovako. U Remoting-u imamo serversku i klijentsku stranu i omoguceno nam je da na klijentu upravljamo nekim objektom ali da svo izvrsavanje bude na serveru. Recimo, za jedan primer Hello World-a, mozemo imati klasu HelloClass koja ce imati jedan metod: HelloWorld()
Klasu cemo instancirati na klijentskoj strani i pozvati, ali ce se metod izvrsiti na serveru (tamo ce se prikazati poruka).
Ono sto je bitno je da i klijent i server moraju znati kako izgleda HelloClass. Posto nam nije potrebna kompletna klasa, vec samo njen "izgled", onda cemo i na serveru i na klijentu imati napravljen interface koji ce nam govoriti kako klasa izgleda. Razlog tome je da se kasnije na serveru nacin rada te klase moze promeniti a da na klijentima ne moramo nista menjati.
Inerfejs ce biti jednostavan za pocetak:
Code:
Public Interface IHello
Sub HelloWorld()
End Interface
On ce nam se nalaziti i na serveru i na klijentu.
Sada cemo na serveru napraviti klasu koja implementira interfejs (radi nesto konkretno):
Code:
Public Class HelloClass
Inherits MarshalByRefObject
Implements IHello
Public Sub HelloWorld()
MsgBox("Hello, World")
End Sub
End Class
Obrati paznju na
Inherits MarshalByRefObject. To znaci da smo nasu klasu nasledili iz MarshalByRefObject odnosno, ovo nas HelloWorld() metod smo nadogradili na MarshalByRefObject a on obezbedjuje sve sto je potrebno da bi klasa mogla da se koristi preko remoting-a.
Sada cemo napraviti pristup nasoj klasi na serveru:
Code:
Dim objServer As IHello
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
Dim ServiceChannel As IChannel
Dim serverProv As BinaryServerFormatterSinkProvider = New BinaryServerFormatterSinkProvider
Dim clientProv As BinaryClientFormatterSinkProvider = New BinaryClientFormatterSinkProvider
Dim Props As IDictionary = New Hashtable
Dim IpInjProvider As New IpInjectorSinkProvider
serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full
Props("port") = "8000"
Props("name") = "HelloSample"
ServiceChannel = New TcpChannel(Props, clientProv, serverProv)
ChannelServices.RegisterChannel(ServiceChannel)
RemotingConfiguration.RegisterWellKnownServiceType(GetType(HelloClass), "HelloSample", WellKnownObjectMode.Singleton)
Catch ex As Exception
MsgBox("Error: " & ex.Message)
End Try
End Sub
Prvi deo je za podesavanje i kreiranje "kanala" (kroz njega se odigrava ceo remoting).
Drugi deo regustruje kanal i "objavljuje" HelloClass.
Sada mozemo na klijentu da napravimo kod za koriscenje klase:
Code:
Private Sub bttnHelloWorld_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttnHelloWorld.Click
Private server As IHello
Private Channel As System.Runtime.Remoting.Channels.tcp.TcpChannel
Private serverProv As New BinaryServerFormatterSinkProvider
Private clientProv As New BinaryClientFormatterSinkProvider
Private props As IDictionary = New Hashtable
serverProv.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full
props("port") = 0
Channel = New TcpChannel(props, clientProv, serverProv)
ChannelServices.RegisterChannel(Channel)
Try
server = CType(Activator.GetObject(GetType(IHello), "tcp://localhost:8000/HelloSample"), IHello)
If server Is Nothing Then
MsgBox("server not found!")
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
If server IsNot Nothing Then
server.HelloWorld()
End Sub
Opet, prvi deo je za namestanje kanala, zatim sledi inicijalizacija objekta i na dalje koriscenje.
Nakon ovoga, na serveru bi trebao da se pojavi message box.
Ovo mozda deluje malo prekomplikovano da bi se uradio samo jedan hello world ali je stvar u tome da ovaj "rezijski" deo ostaje takav a samo povecavas interfejse i klase koje koristis, tako da je za slozenije stvari i prihvatljivije.
Napominjem opet da nisam isprobao ovo. Probaj, pregledaj kod, vidi ima li neke greske (a verovatno ima, tako da ces morati da prodjes kroz kod ;)) pa ako ima nesto nejasno - pitaj.