Связь между различными сервисами на C # - PullRequest
3 голосов
/ 30 марта 2011

Есть ли способ связи между двумя разными службами?У меня есть служба, которая уже работает.Есть ли способ создать вторую службу, которая может присоединяться к первой службе и отправлять и получать даты для нее?

Я также хотел бы получить доступ к службе Windows из консольного приложения и подключиться к ней.Возможно ли это?

Ответы [ 2 ]

7 голосов
/ 30 марта 2011

Вы можете попытаться реализовать это, используя:

Пример использования WCF: Многозначный локальный IPC с использованием WCF и NetNamedPipeBindin .

Другой пример: A C # Framework для межпроцессной синхронизации и связи .

Все зависит от того, какую версию .NET Framework вы используете. Если вы используете .NET 3.0 и выше, вы можете взглянуть на WCF . Если нет, то вы сами по себе и можете гуглить по ключевым словам P / Invoke (CreateFileMapping, MapViewOfFile, CreatePipe ...).

3 голосов
/ 30 марта 2011

Для начала я бы поиграл с tcpclient и tcpserver

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.aspx

Даже если данные, которые вам нужно отправить, более сложны, чем дата, их легко сериализовать / десериализовать.

Для отправки и получения дат это выглядит самым простым вариантом.

Также носки работают, если сервисы работают на разных машинах, а разделяемая память и namedpipes - нет.

пример кода

// Create a thread running this code in your onstarted method of the service

using System.IO;
using System.Net;
using System.Net.Sockets;

var server = new TcpListener(IPAddress.Parse("127.0.0.1"), 8889);
server.Start();

while(true) {
  var client = server.AcceptTcpClient(); 

  using(var sr = new StreamReader(client.GetStream())) {
    var date = DateTime.Parse(sr.ReadToEnd());
    Console.WriteLine(date);
  } 
}

// In the console

using System.IO;
using System.Net;
using System.Net.Sockets;

var client = new TcpClient("localhost",8889); 
using(var sw = new StreamWriter(client.GetStream())) {
  sw.Write(System.DateTime.Now);
}
...