c# - 使用 .NET 通过网络连接两个程序

标签 c# network-programming

<分区>

Possible Duplicate:
Can C# be piped?

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

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 ==/

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

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

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

简而言之,我想做的是让客户端和服务器可以像在同一台计算机上一样进行通信,他们正在使用 COM,而无需“中间人”翻译任何内容,只是连接它们。

最佳答案

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

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

它的工作原理是在服务器和客户端之间创建契约,定义为 .NET 接口(interface)(有一些注意事项),然后可以通过服务器(使用一系列协议(protocol))公开并由客户端应用程序使用.

可以关注this article快速入门该技术;它应该为您提供足够的信息来创建原型(prototype),看看它是否满足您的需求。

虽然 WCF 的主题非常庞大,因此您需要花时间了解它才能让它完全按照您的意愿工作。


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

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

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

关于c# - 使用 .NET 通过网络连接两个程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9621619/

相关文章:

python asyncore 在客户端连接后使用 100% CPU

c# - 获取当前事件 session 的所有进程

c# - 如何使用 Microsoft Graph sdk 通过电子邮件地址从 Active Directory 获取用户信息

c - 了解链路层多播

ios - GCDAsyncUdpSocket, "Cannot bind socket more than once"

java - 如何使用java获取网络设备的MAC地址

c# - Xamarin Android : Failed to resolve type MvvmCross. Core.ViewModels.IMvxAppStart

c# - 属性实现——菜鸟知识匮乏

c# - 2013 和 2015 调试编译之间的匿名方法静态性不同

java - ClassCastException : Proxy0 cannot be cast to interfaces. 患者