Introduction
Why am I publishing this sample?
Because it is very difficult to find working code in the MSDN or internet. Most samples require awkward config files or they are much too complicated for beginners. This sample runs immediately and does not require config files.
The original intention was to remote control an application on a slave computer via network. The master sends a command and waits for the slave until it executes the remote command. This sample sends only text strings, but it can easily be expanded to transfer anything. (See class cTransfer
.)
Features
- Demonstration of .NET Remoting.
- Very simple and easy to understand code!!
- No awkward config files necessary (Port and Host are specified in the GUI).
- Master.exe (client) and Slave.exe (host) can either run on the same computer (localhost) or on different computers in the network.
- Multiple Masters can connect to one Slave on the same port (but not at once)
- Multiple instances of Masters and Slaves can communicate independently from each other on different ports.
- To keep this sample simple, it uses a blocking call to the Slave. This means the Master waits for the response of the Slave. (This may be useful for sending commands to another computer and get the result after the Slave is ready with executing the remote command.)
How does it work?
Programming .NET Remoting
There a three major ways to use .NET Remoting (this sample uses the first one):
Publishing a public object
(Object is created locally and then published.)
Host:
ChannelServices.RegisterChannel (new TcpChannel(1500));
cTransfer Trans = new cTransfer();
RemotingServices.Marshal (Trans, "TestService");
Client:
cTransfer T = (cTransfer) Activator.GetObject(typeof(cTransfer),
"tcp://host:1500/TestService");
Remote creation of a public object (SAO)
(Object is created on request of client)
Host:
ChannelServices.RegisterChannel (new TcpChannel(1500));
RemotingConfiguration.RegisterWellKnownServiceType(typeof(cTransfer),
"TestService", WellKnownObjectMode.Singleton);
Client:
cTransfer T = (cTransfer) Activator.GetObject(typeof(cTransfer),
"tcp://host:1500/TestService");
Remote creation of a private object (CAO)
(Object is created on host and client receives a reference to it)
Host:
ChannelServices.RegisterChannel (new TcpChannel(1500));
RemotingConfiguration.RegisterActivatedServiceType(typeof(cTransfer));
Client:
object[] attr = {new UrlAttribute("tcp://host:1500")};
object[] args = {"Sample constructor argument"};
cTransfer T = (cTransfer) Activator.CreateInstance(typeof(cTransfer), args, attr);
Notes:
cTransfer
is a class which is defined in Remoting.DLL. It contains the variables and an event to communicate between Host and Client.
- These samples use port 1500. You can use any TCP port which is unused and not blocked by the firewall.
- The Endpoint used here is "TcpService". You can use any name, but Host and Client must always use the same endpoint name!
This should be enough of explanation. Look into the source code: it's really simple!