Use Visual C# to create a remote server
This article helps you create a remote server where another application can access by using Visual C#.
Original product version: Visual C#
Original KB number: 307445
Summary
This article illustrates how to create a remote server that another application can access. The application that accesses this server can be located on the same computer, on a different computer, or on a different network. The remote server is broken into two parts: the server object and the server application. The server object is the object that the client communicates with, and the server application is used to register the server object with the .NET Remoting run-time framework.
This article refers to the following Microsoft .NET Framework Class Library namespaces:
System.Runtime.Remoting
System.Runtime.Remoting.Channels
System.Runtime.Remoting.Channels.Tcp
Requirements
This article assumes that you are familiar with the following topics:
- Visual Studio .NET or Visual Studio
- Visual C# .NET or Visual C#
- Networking
Creating the remote server object
The first step in creating the server application is to create a server object. The server object is what the client application instantiates and communicates with on the server computer. The client application does this through a proxy object that is created on the client. In this sample, the server object resides in a Class Library (DLL) and is called myRemoteClass.
Create a new Class Library application in Visual C# .NET. Name the project ServerClass. Class1 is created by default.
In Solution Explorer, rename the Class1.cs code file to ServerClass.cs.
Open ServerClass.cs and rename Class1 to myRemoteClass. You also need to rename the default constructor for the class to so that it matches the class name. myRemoteClass should inherit from the
MarshalByRefObject
class. Your class should now appear as follows:public class myRemoteClass: MarshalByRefObject { public myRemoteClass() { // TO DO: Add constructor logic here. } }
Add a public method to myRemoteClass that takes a string, displays a message to the console with a value of the string, and returns True if the string is not empty.
public bool SetString(String sTemp) { try { Console.WriteLine("This string '{0}' has a length of {1}", sTemp, sTemp.Length); return sTemp != ""; } catch { return false; } }
Build the project to create the ServerClass.dll assembly.
Save and close the project.
Create the remote server application
After you have created the server object that the client will communicate with, you must register this object with the Remoting framework. When you register the object, you must also start the server and have the server listen on a port for clients to connect to that port. To do this, you need a project type that outputs an executable file.
The reason to include the server object in a separate project is so that you can easily reference the server object from the client project. If you include it in this project you cannot reference it, because references can only be set to DLL files.
Create a new Console Application in Visual C# .NET to start the remote server. Class1 is created by default.
In Solution Explorer, rename the Class1.cs file to RemoteServer.cs.
Add a reference to the
System.Runtime.Remoting
namespace.Add a reference to the ServerClass.dll assembly that you created in the previous section.
Use the
using
statement on theRemoting
,Remoting.Channels
, andRemoting.Channels.TCP
namespaces so that you aren't required to qualify declarations in those namespaces later in your code. You must use theusing
statement prior to any other declarations.using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp;
Declare the appropriate variable. Declare and initialize a
TcpChannel
object that listens for clients to connect on a certain port, which is port 8085 in this example. Use theRegisterChannel
method to register the channel with the channel services. Add the following declaration code in theMain
procedure ofClass1
:TcpChannel chan = new TcpChannel(8085); ChannelServices.RegisterChannel(chan);
Call the
RegisterWellKnownType
method of theRemotingConfiguration
object to register theServerClass
object with the Remoting framework, and specify the following parameters:The full type name of the object that is being registered (which is ServerClass.myRemoteClass in this example), followed by the assembly name ServerClass. Specify both the name of the namespace as well as the class name here. Because you didn't specify a namespace in the previous section, the default root namespace is used.
Name the endpoint where the object is to be published as RemoteTest. Clients need to know this name in order to connect to the object.
Use the
SingleCall
object mode to specify the final parameter. The object mode specifies the lifetime of the object when it is activated on the server. In the case ofSingleCall
objects, a new instance of the class is created for each call that a client makes, even if the same client calls the same method more than once. On the other hand,Singleton
objects are created only once, and all clients communicate with the same object.RemotingConfiguration.RegisterWellKnownServiceType( System.Type.GetType("ServerClass.myRemoteClass, ServerClass"), "RemoteTest", WellKnownObjectMode.SingleCall);
Use the
ReadLine
method of theConsole
object to keep the server application running.System.Console.WriteLine("Hit <enter> to exit..."); System.Console.ReadLine();
Build your project.
Save and close the project.
References
For an overview of .NET Remoting, see the .NET Framework Developer's Guide documentation.
Feedback
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for