Introduction til.net remoting i C#

Relaterede dokumenter
Introduction til.net remoting i VB.NET

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Singleton pattern i C#

Singleton pattern i Java

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

Arkitektur for begyndere

Test med JUnit 3. Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det.

Test med NUnit. Denne artikel introducerer NUnit. Den forklarer ideen med NUnit. Og den viser hvordan man konkret bruger det.

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

Anvendelse af metoder - Programmering

Hvad er Objekter - Programmering

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

Undtagelseshåndtering i C#

Den forudsætter kendskab til XML og VB.NET men ikke til brug af XML i VB.NET.

Logging i Java. Den forudsætter kendskab til Java og noget generel udviklings erfaring. Denne guide er oprindeligt udgivet på Eksperten.

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

At klippe en streng over på det mest hensigtsmæssige sted

Introduktion til NAnt

Hvordan vælger jeg dokumentprofilen?

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

RMI med BlueJ. Tutorial lavet af Jákup W. Hansen TSU semester 11. desember 2007

Java Klasse nedarvninger

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

Database design for begyndere

Introduktion til AOP i C#

Geografisk lokalisering i ASP.NET

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.

Bits, bit operationer, integers og floating point

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

Forskellige Java versioner

Udvikling af DOTNET applikationer til MicroStation i C#

.NET 4.5 og C# 5.0. Denne artikel beskriver nogle af de nye features i.net 4.5 og C# 5.0. Den forudsætter et vist kendskab til.net og C#.

Hvilket sprog er hurtigst

Note om RMI af Peter Kjærsgaard

Med register_globals = On får du automatisk adgang til en række variabelnavne i dit script.

Introduktion til ant. Denne artikel beskriver Apache ant, som er et værktøj til at builde Java applikationer med.

Plugin-arkitektur med.net

Endnu mere om tilfældige tal

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

Hvilket sprog skal jeg lære?

Hvad er et distribueret objekt? Plan Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation

Upload af billeder/filer for nybegyndere Del. 2

IT projekt person galleri

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

CodeDOM - Dynamisk generering og kompilering af kode

Hvilket sprog skal jeg lære?

DM507 Algoritmer og datastrukturer

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere

Nye Java XML API'er

SWC eksamens-spørgsmål. Oversigt

SWC Elementer i klassedefinition

Abstrakte datatyper C#-version

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

A Profile for Safety Critical Java

Afsending af s vha. ASP

Webserverprogrammering

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

Tredjepart webservices

Objektorienteret Programmering

DANMARKS TEKNISKE UNIVERSITET

Indhold. Senest opdateret:03. september Side 1 af 8

MapBasic &.NET interaktion. MapBasic.NET. Jakob Lanstorp IT konsulent COWI. Odense 23. Juni jun 2011 MapBasic &.

Denne artikel gennemgår kort nogle mulighederne for brug af XML i ASP. Det sker ved brug af eksempler. Eksemplerne vil være i VBS.

.NET 4.0 og C# 4.0. Denne artikel beskriver nogle af de nye features i.net 4.0 og C# 4.0. Den forudsætter et vist kendskab til.net og C#.

Java web applikationer med Tomcat

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

CVS som KS-værktøj E Branching, Merging m.v.

Indhold. Senest opdateret : 30. juli Side 1 af 5

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

Videregående programmering i Java

Delphi - CrackMe og Keygen

Tree klassen fra sidste forelæsning

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

DM507 Algoritmer og datastrukturer

Ugeseddel 4 1. marts - 8. marts

Objektorienterede metoder

applikation----x----odbc driver manager----foobar ODBC driver----foobar database

Introduktion til SQL queries

DM507 Algoritmer og datastrukturer

Lektion 6. Grundlæggende programmering i VR

Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

Sekvensafstand DM34 - Eksamensopgave. Jacob Aae Mikkelsen

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

14.1 Internationale programmer

Distribuerte Objekter. Våren 2010 Professor II Eric Jul F

Udfordringer og problemstillinger. En liste over de udfordringer og problemstillinger, der er ved Java og JEE udvikling

Skriftlig eksamen i Datalogi

DM507 Algoritmer og datastrukturer

DM502. Peter Schneider-Kamp

Vejledning til Retsinformation web services test stubs

Delphi og Databaser for begyndere

Introduktion til funktioner, moduler og scopes i Python

I denne artikel vil jeg gennemgå hvordan en side for RSS "Live Bogmærke" kan se ud.

Geografisk lokalisering i JSP

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

Transkript:

Denne guide er oprindeligt udgivet på Eksperten.dk Introduction til.net remoting i C# Denne artikel beskriver teorien bag.net remoting og viser nogle simple kode eksempler i C#. Den forudsætter kendskab til C#. Der er en anden artikel med præcis samme indhold bare i VB.NET! Skrevet den 04. Feb 2009 af arne_v I kategorien Programmering / C# Historie: V1.0-18/01/2004 - original V1.1-31/01/2004 - forbedret formatering V1.2-09/02/2004 - flere ændringer af formatering V1.3-11/04/2004 - tilføj avanceret eksempel Baggrund.NET remoting svarer konceptuelt til Java RMI, men har dog en noget anderledes implementering..net remoting bygger på det såkaldte Proxy Pattern (et af de originale patterns fra Design Patterns af Erich Gamma m.fl.). Ideen er at en client kan kalde remote server kode på samme måde som lokal kode. Selve kaldet foregår som: client kode--stub kode--(netværk)--skeleton kode--server kode Stub koden har samme interface som server koden. Stub koden pakker alle argumenter ned (serialiserer) og sender dem over en socket til skeleton koden. Skeleton koden udpakker alle argumenter (deserialiserer) og kalder server koden. Retur værdien sende tilbage på samme vis bare modsat. Både stub og skeleton koden er 100% dynamisk i.net frameworket. (der skal ikke genereres noget kode). Man skelner mellem: SAO (Server Activated Objects) CAO (Client Activated Objects) Og med SAO skelner man mellem: SingleCall Singleton SAO Singlecall betyder at der instantieres et remote objekt per kald.

SAO Singleton betyder at der instantieres et enkelt remote objekt ad gangen (bemærk at det ikke er et ægte singleton objekt - det kan blive garbage collectet og et nyt objekt instantieret - der er bare aldrig mere end et ad gangen). CAO betyder at der instantieres et remote objekt hver gang klienten instantierer et lokalt objekt. Eksempler Lad os tage nogle eksempler. Calc.cs (fælles for alle 3 eksempler) // remote object klasse // skal extende MarshalByRefObject public class Calc : MarshalByRefObject // object nummer ud af total private int no; private static int total = 0; // synkroniserings objekt private object sync = new object(); // constructor som sætter objekt nummer public Calc() lock(sync) total++; no = total; // metoder der skal kaldes remote public int add(int a, int b) return (a + b); public int mul(int a, int b) return (a * b); // metode til at checke egenskaberne public string ID get return (no + " of " + total);

SAO Singlecall: Server1.cs // server klasse class Server1 // registrere channel ChannelServices.RegisterChannel(new TcpServerChannel(50000)); // registrere well known type for singlecall RemotingConfiguration.RegisterWellKnownServiceType(typeof(Calc), "Calc", WellKnownObjectMode.SingleCall); Console.Write("Press enter to exit"); Console.ReadLine(); Client1.cs // test client klasse class Client1 // måde 1 til at kalde remote server private static void test1() Calc clc = (Calc)Activator.GetObject(typeof(Calc), // kald metode som viser at der instatieres et nyt objekt per kald // måde 2 til at kalde remote serverr private static void test2() Calc clc = (Calc)RemotingServices.Connect(typeof(Calc),

// kald metode som viser at der instatieres et nyt objekt per kald // måde 3 til at kalde remote server private static void test3() RemotingConfiguration.RegisterWellKnownClientType(typeof(Calc), Calc clc = new Calc(); // kald metode som viser at der instatieres et nyt objekt per kald // brug TCP/IP ChannelServices.RegisterChannel(new TcpClientChannel()); // test 3 måder test1(); test2(); test3(); build csc /optimize+ /t:library /out:calc.dll Calc.cs csc /optimize+ /t:exe /r:calc.dll /out:server1.exe Server1.cs csc /optimize+ /t:exe /r:calc.dll /out:client1.exe Client1.cs SAO Singleton: Server2.cs // server klasse class Server2 // registrere channel

"Calc", ChannelServices.RegisterChannel(new TcpServerChannel(50000)); // registrere well known type for singleton RemotingConfiguration.RegisterWellKnownServiceType(typeof(Calc), WellKnownObjectMode.Singleton); Console.Write("Press enter to exit"); Console.ReadLine(); Client2.cs // test client klasse class Client2 // måde 1 til at kalde remote server private static void test1() Calc clc = (Calc)Activator.GetObject(typeof(Calc), // kald metode som viser at der kun instatieres et objekt som deles af alle kald // måde 2 til at kalde remote serverr private static void test2() Calc clc = (Calc)RemotingServices.Connect(typeof(Calc), // kald metode som viser at der kun instatieres et objekt som deles af alle kald // måde 3 til at kalde remote server private static void test3() RemotingConfiguration.RegisterWellKnownClientType(typeof(Calc),

Calc clc = new Calc(); // kald metode som viser at der kun instatieres et objekt som deles af alle kald // brug TCP/IP ChannelServices.RegisterChannel(new TcpClientChannel()); // test 3 måder test1(); test2(); test3(); build csc /optimize+ /t:library /out:calc.dll Calc.cs csc /optimize+ /t:exe /r:calc.dll /out:server2.exe Server2.cs csc /optimize+ /t:exe /r:calc.dll /out:client2.exe Client2.cs CAO: Server3.cs // server klasse class Server3 // registrere channel ChannelServices.RegisterChannel(new TcpServerChannel(50000)); // registrere type under navn RemotingConfiguration.ApplicationName = "Calc"; RemotingConfiguration.RegisterActivatedServiceType(typeof(Calc)); Console.Write("Press enter to exit"); Console.ReadLine(); Client3.cs

using System.Runtime.Remoting.Activation; // test client klasse class Client3 // måde 1 til at kalde remote server private static void test1() Calc clc = (Calc)Activator.CreateInstance(typeof(Calc), null, new object[] new UrlAttribute("tcp://localhost:50000/Calc") ); // kald metode som viser at der instatieres et server objekt for hver client objekt // måde 2 til at kalde remote server private static void test2() RemotingConfiguration.RegisterActivatedClientType(typeof(Calc), Calc clc = new Calc(); // kald metode som viser at der instatieres et server objekt for hver client objekt // brug TCP/IP ChannelServices.RegisterChannel(new TcpClientChannel()); // test 2 måder test1(); test2(); build csc /optimize+ /t:library /out:calc.dll Calc.cs csc /optimize+ /t:exe /r:calc.dll /out:server3.exe Server3.cs csc /optimize+ /t:exe /r:calc.dll /out:client3.exe Client3.cs

Avanceret eksempel Vi laver nu et eksempel med: - SAO Singleton - adskillelse af interface og implementation - 2 forskellige implementationer - configurations fil på server side - brug af namespaces X.cs namespace X.Common // interface public interface IX string WhoAmI(); XImpl.cs using X.Common; namespace X.Impl // implementation // skal extende MarshalByRefObject og interfacet public class XRealA : MarshalByRefObject, IX public string WhoAmI() return "I am A"; // implementation // skal extende MarshalByRefObject og interfacet public class XRealB : MarshalByRefObject, IX public string WhoAmI() return "I am B"; XServer.cs namespace X.Server

// server klasse class XServer // konfigurer RemotingConfiguration.Configure("XServer.exe.config"); Console.Write("Press enter to exit"); Console.ReadLine(); XServer.exe.config <configuration> <system.runtime.remoting> <application name="xserver"> <service> <wellknown mode="singleton" type="x.impl.xreala, XImpl" objecturi="a"/> <wellknown mode="singleton" type="x.impl.xrealb, XImpl" objecturi="b"/> </service> <channels> <channel port="50000" ref="tcp"/> </channels> </application> </system.runtime.remoting> </configuration> XClient.cs using X.Common; namespace X.Client // test client klasse class XClient // test ChannelServices.RegisterChannel(new TcpClientChannel()); IX a = (IX)Activator.GetObject(typeof(IX), "tcp://localhost:50000/a");

Console.WriteLine(a.WhoAmI()); IX b = (IX)Activator.GetObject(typeof(IX), "tcp://localhost:50000/b"); Console.WriteLine(b.WhoAmI()); build csc /optimize+ /t:library /out:x.dll X.cs csc /optimize+ /t:library /r:x.dll /out:ximpl.dll XImpl.cs csc /optimize+ /t:exe /out:xserver.exe XServer.cs csc /optimize+ /t:exe /r:x.dll /out:xclient.exe XClient.cs Videre.NET frameworket indeholder et meget sofistikeret framework af channels, sinks og formatters som gøre det muligt at bruge remoting på næsten uendeligt mange måder. Kommentar af cogitans d. 10. Jun 2007 1 Hvis koden kopieres direkte, kan man så forvente et tilfredsstillende kørsel? F.eks. "XServer.exe.config" i linien RemotingConfiguration.Configure("XServer.exe.config"); hvor skal den findes? Altså hvor skal man manuelt oprette den fil? Kommentar af danielhep d. 25. May 2004 2 fino fino Kommentar af j_jorgensen d. 06. Jan 2005 3 Manglere meget beskrivende tekst. Dog ganske rart med eksempler i massevis! Kommentar af nielle d. 02. Jul 2007 4 Udemærket artikel, men den kunne passende udvides med en lille begrundelse for hvornår man bør vælge SAO SingleCall, SAO Singleton eller CAO respektiv.