Ватсон Карли
Шрифт:
}
public string Greeting(string name) {
Console.WriteLine("Greeting called");
return "Hello, " + name;
}
}
}
Простой сервер
Для сервера используется консольное приложение C#. Для применения класса
TcpServerChannel
необходимо сослаться на сборку System.Runtime.Remoting.dll
. Также требуется, чтобы мы ссылались на созданную ранее сборку RemoteHello.dll
. В методе
Main
создается объект System.Runtime.Remoting.Channel.Тcр.TcpServerChannel
с портом номер 8086. Этот канал регистрируется в классе System.Runtime.Remoting.Channels.ChannelServices
, чтобы сделать его доступным для удаленных объектов. Тип удаленного объекта регистрируется с помощью System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType
. Здесь определяется тип класса в удаленном объекте, используемый клиентом URI, и режим. Режим WellKnownObject.SingleCall
означает, что для каждого вызова метода создается новый экземпляр, мы не храним состояние в удаленном объекте. После регистрации удаленного объекта продолжим выполнение сервера, пока не будет нажата клавиша:
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace Wrox.ProfessionalCSharp {
/// <summary>
/// Краткое описание Class1
/// </summary>
public class HelloServer {
public static void Main(string[] args) {
TcpServerChannel channel = new TcpServerChannel(8086);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(
typeof(Hello), "Hi", WellKnownObjectMode.SingleCall);
System.Console.WriteLine("hit to exit");
System.Console.ReadLine;
}
}
}
Простой клиент
Клиент также является консольным приложением C#. И здесь делается ссылка на сборку
System.Runtime.Remoting.dll
, чтобы можно было использовать класс TcpClientChannel
. Кроме того, имеется ссылка на сборку RemoteHello.dll
. Хотя объект будет создаваться на удаленном сервере, нам понадобится сборка на стороне клиента, чтобы прокси прочитал метаданные во время выполнения. В клиентской программе создается объект
TcpClientChannel
, который регистрируется в ChannelServices
. Для TcpChannel
используется конструктор по умолчанию, поэтому выбирается свободный порт. Затем используется класс Activator
для возврата прокси удаленному объекту. Прокси является типом System.Runtime.Remoting.Proxies._TransparentProxy
. Этот объект выглядит как реальный. Это делается с помощью механизма отражения, в котором считываются метаданные реального объекта. Прозрачный прокси использует реальный для пересылки сообщений в канал: using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace Wrox.ProfessionalCSharp {
/// <summary>
/// Краткое описание Class1.
/// </summary>
public class HelloClient {
public static void Main(string[] args) {
ChannelServices.RegisterChannel(new TcpClientChannel);
Hello obj = (Hello)Activator.GetObject(typeof(Hello), "tcp://localhost:8086/Hi");
if (obj == null) {
Console.WriteLine("could not locate server"); return;
}
for (int i = 0; i < 5; i++) {
Console.WriteLine(obj.Greeting("Christian"));
}
}
}
}
Когда запустятся сервер и клиентская программа Hello, Christian появится пять раз на клиентской консоли. В консольном окне серверного приложения можно будет увидеть вывод, аналогичный следующему: