不同基于C#的服务之间的通信

时间:2011-03-30 13:24:19

标签: c# windows windows-services interprocess

有没有办法在两种不同的服务之间进行通信?我有一个已经运行的服务。有没有办法创建可以附加到第一个服务并向其发送和接收日期的第二个服务?

我还想从控制台应用程序访问Windows服务并附加到它。有可能吗?

2 个答案:

答案 0 :(得分:7)

您可以尝试使用以下方法实现此目的:

使用WCF的示例:Many to One Local IPC using WCF and NetNamedPipeBindin

其他例子:A C# Framework for Interprocess Synchronization and Communication

一切都取决于您使用的.NET Framework版本。如果您使用.NET 3.0及更高版本,那么您可以查看WCF。如果没有,那么你就是自己的,你可以在关键字P/Invoke上进行谷歌搜索(CreateFileMapping,MapViewOfFile,CreatePipe ...)。

答案 1 :(得分:3)

首先,我将使用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

即使您需要发送的数据比日期更复杂,也可以轻松地序列化/反序列化。

对于发送和接收日期,这将选择最简单的选项。

如果服务在不同的机器上运行,而且共享内存和命名管道不运行,那么袜子也可以工作。

示例代码

// 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);
}