2016-02-18 14 views
2

Я недавно начал работу с удалением .Net, и мне удалось работать с некоторыми простыми учебниками, такими как создание библиотеки DLL, которая работает как калькулятор, к которому клиент может получить доступ и использовать (https://www.youtube.com/watch?v=Ve4AQnZ-_H0)..Net Remoting function

Что я ищу, чтобы понять, как получить доступ к текущей информации, хранящейся на сервере. Например, если у меня есть эта простая часть работает на сервере:

int x = 0; 

while (!Console.KeyAvailable) 
{ 
x++; 
System.Threading.Thread.Sleep(1000); 
Console.WriteLine(x); 
} 

То, что я нашел до сих пор является то, что длл построен возвращает только статический результат, например, с помощью калькулятора. Я хотел бы узнать, сколько х на сервере в любой момент, через клиента.

Я не знаю, если я буду достаточно ясным, но я постараюсь лучше объяснить, если это необходимо.

+0

.NET Remoting следует использовать только для работы с устаревшими компонентами, любое новое развитие должно быть сделано в WCF. (см. жирный текст в верхней части [этой страницы] (https://msdn.microsoft.com/en-us/library/kwdt6w2k (v = vs.100) .ASPX)) –

+0

@ScottChamberlain Даже WCF в значительной степени устарел и не должен использоваться в новых разработках, если вам действительно не нужен SOAP или действительно определенные функции, разрешенные только WCF. В противном случае используйте WebAPI. В этом случае калькулятор может использовать сервер и запрашивать x для увеличения. x может быть статическим, и операция может просто вернуть глобальное значение (хотя я бы не поставил это в производство для очевидных проблем параллелизма). – gretro

+1

@gretro meh, я говорю, что WCF и WebAPI сосуществуют. один хорош для некоторых вещей, и один хорош для других вещей. Ни один из них не заменяет другого. –

ответ

1

В следующей реализации сервера показано, как можно поддерживать состояние между вызовами.

// this gets instantiated by clients over remoting 
public class Server:MarshalByRefObject 
{ 
    // server wide state 
    public static int Value; 

    // state only for this instance (that can be shared with several clients 
    // depending on its activation model) 
    private StringBuilder buildup; 

    // an instance 
    public Server() 
    { 
     buildup = new StringBuilder(); 
     Console.WriteLine("server started"); 
    } 

    // do something useful 
    public int DoWork(char ch) 
    { 
     Console.WriteLine("server received {0}", ch); 
     buildup.Append(ch); 
     return Value; 
    } 

    // return all typed chars 
    public string GetMessage() 
    { 
     Console.WriteLine("server GetMessage called") ; 
     return buildup.ToString(); 
    } 

    // how long should this instance live 
    public override object InitializeLifetimeService() 
    { 
     // run forever 
     return null; 
    } 
} 

Обратите внимание на переопределение InitializeLifetimeService. Если вы не контролируете это, ваш экземпляр будет разорван через 5 минут.

Чтобы использовать вышеуказанный класс, мы используем следующий код для запуска и запуска прослушивателя, включая некоторые из вашей логики. Не забудьте добавить ссылку на сборку System.Runtime.Remoting.

static void Main(string[] args) 
{ 
    // which port 
    var chn = new HttpChannel(1234); 
    ChannelServices.RegisterChannel(chn, false); 

    // Create only ONE Server instance 
    RemotingConfiguration.RegisterWellKnownServiceType(
     typeof(Server), "server", WellKnownObjectMode.Singleton); 

    Server.Value = 0; 
    while (!Console.KeyAvailable) 
    { 
     Server.Value++; 
     System.Threading.Thread.Sleep(1000); 
     Console.WriteLine(Server.Value); 
    } 
} 

Когда этот код работает, он должен прослушивать локальное поле на порту 1234 для соединений. При первом запуске мне пришлось отключить брандмауэр, разрешить этому порту передавать локальный брандмауэр.

Реализация клиента, использующая Server, может выглядеть следующим образом. Не забудьте добавить ссылку на сборку System.Runtime.Remoting.

static void Main(string[] args) 
{ 
    var chn = new HttpChannel(); 
    ChannelServices.RegisterChannel(chn, false); 

    RemotingConfiguration.RegisterWellKnownClientType(
     typeof(Server), 
     "http://localhost:1234/server"); 

    Console.WriteLine("Creating server..."); 
    var s = new Server(); 

    Console.WriteLine("type chars, press p to print, press x to stop"); 
    var ch = Console.ReadKey(); 
    while(ch.KeyChar != 'x') 
    { 

     switch(ch.KeyChar) 
     { 
      case 'p': 
       Console.WriteLine("msg: {0}", s.GetMessage()); 
       break; 
      default: 
       Console.WriteLine("Got value {0} ", s.DoWork(ch.KeyChar)); 
       break; 
     } 

      ch = Console.ReadKey(); 
    } 
    Console.WriteLine("stopped"); 
} 

Если скомпилировать и запустить этот ваш результат может выглядеть следующим образом:

demo of client and server with remoting