使用.NET在网络上连接两个程序

时间:2012-03-08 16:58:16

标签: c# network-programming

  

可能重复:
  Can C# be piped?

是否有办法通过网络连接两个程序,使得来自一个程序的所有呼叫都可以通过管道传输到另一台计算机,然后提供给接收程序。我已经包含了一种我可以在下面执行此操作的方法,但应该有更好的方法,因为这将是一个庞大的(并且看似毫无意义)代码,以保持最新。我正在使用的程序是Ascom,它使用大量与COM进行的进程间通信。这只是一个例子,有许多接口需要保持更新。

class SwitchConverter : ASCOM.Interface.ISwitch
{
    private Client client = new Client();
    private string query(string query){ return client.query(query); }
    private void send(string command) { client.send(command); }
    public bool Connected { get { return bool.Parse(query("SWITCHGETCONN")); } set { send("SWITCHSETCONN:" + value); } }
    public string Description { get { return query("SWITCHGETDESC"); } }
    public string DriverInfo { get { return query("SWITCHGETDRVI"); } }
    public string DriverVersion { get { return query("SWITCHGETDRVV"); } }
    public bool GetSwitch(short ID) { return bool.Parse(query("SWITCHGETSTAT:" + ID)); }
    public string GetSwitchName(short ID) { return query("SWITCHGETNAME:" + ID); }
    public short InterfaceVersion { get { return short.Parse(query("SWITCHGETINTV")); } }
    public short MaxSwitch { get { return short.Parse(query("SWITCHGETMAXS")); } }
    public string Name { get { return query("SWITCHGETNAME"); } }
    public void SetSwitch(short ID, bool State) { send("SWITCHSETSTAT:" + ID + "-" + State); }
    public void SetSwitchName(short ID, string Name) { send("SWITCHSETNAME:" + ID + "-" + Name); }
    public void SetupDialog() { throw new NotImplementedException(); }
}

所以你可以看到它看起来像这样:

            /== Encoder ==\                /== Decoder ==\
           /=== Encoder ===\              /=== Decoder ===\
          /==== Encoder ====\            /==== Decoder ====\
Client ==<===== Encoder =====>== Pipe ==<===== Decoder =====>== Server
          \==== Encoder ====/            \==== Decoder ====/
           \=== Encoder ===/              \=== Decoder ===/
            \== Encoder ==/                \== Decoder ==/

现在,有没有办法简单地获取服务器接口,并将其传输到客户端,并将客户端接口连接到服务器,如下图所示?这样服务器就会调用管道,管道会将它转发给客户端。如果客户端会调用服务器,它只会将其转发到服务器。由于我们正在处理单独的程序,我认为这应该非常简单。我正在阅读有关.NET Remoting的内容,但这显然已被弃用。之前我问过这个问题,但没有人回答,所以我想我会详细说出//我正在试图做什么。

Client ====(<Server) Pipe (Client>)==== Server

当我说管道时,我只是指通过网络将数据从一个程序发送到另一个程序的连接。此外,我正在寻找示例实现或示例实现的链接。不只是&#34;尝试x或y&#34;。这必须是可能的!

简而言之,我要做的就是让客户端和服务器可以进行通信,就像他们在同一台计算机上一样,他们使用的是COM,而不会让#34; man在中间&#34; ;翻译任何东西,只需连接它们。

1 个答案:

答案 0 :(得分:4)

您的问题提出的目标有点难以传播,但据我了解,您正在寻找通过网络在客户端和服务器之间进行通信的机制。

如果是这种情况,Windows Communication Foundation(WCF)应该是您的工具。

它基于在服务器和客户端之间创建契约,定义为.NET接口(带有一些警告),然后可以通过服务器(使用一系列协议)公开并由客户端应用程序使用

您可以按照this article快速了解该技术;它应该为您提供足够的信息来创建原型,以确定它是否符合您的需求。

WCF的主题非常庞大,所以你需要花时间让它完全按照你的意愿运作。


如果您的流程在同一个框中运行,您可以使用命名管道执行跨进程通信(<netNamedPipeBinding>),作为COM的替代。命名管道专为跨进程通信而设计,在此任务中非常有效。

如果您的进程在不同的框上运行,则可以使用TCP通过网络执行相同的通信(<netTcpBinding>)。 TCP将以二进制消息进行通信,因此对于两个进程之间的通信仍然非常有效。

就WCF而言,这些只是配置设置。一旦设置了服务器和客户端,就可以像在两个应用程序位于同一个盒子上一样轻松地通过网络进行通信。