【问题标题】:Switching from WCF to network library从 WCF 切换到网络库
【发布时间】:2016-04-06 18:09:12
【问题描述】:

目前,我在我的项目中使用 WCF 进行网络连接。但是,我想切换到一些网络库,例如 Lidgren Network。

由于它是 WCF,它使用接口,可以通过一种方法发送和接收数据,并且 Lidgren 网络处于较低级别,您需要构建和发送数据包,这不是问题。

问题是,我不知道如何仅使用一种方法(例如使用 WCF)进行发送和接收。

假设我有一些使用 WCF 的客户端代码:

void SomeCode()
{
    var status = wcfChannel.CheckUserId(id);
    if (status)
    {
        // true
        // do something
    }
    else
    {
        // false
        // do something
    }
}

Lidgren 网络将是:

void SomeCode()
{
    var packet = new packet(...);
    packet.Write(id);
    var status = send2Server(packet);
    if (status)
    {
        // true
        // do something
    }
    else
    {
        // false
        // do something
    }
}

所以,'send2Server' 应该以某种方式实现。由于它只能循环接收数据包(?),我没有任何想法。 好吧,一个 - 我可以在 SomeCode 的类中有一些变量,并且客户端网络接收数据包的循环会改变 SomeCode 的类中的这些变量。此外,需要添加一些延迟,并让这些变量进一步使用。 但是,应该有更好的方法来实现这一点。

【问题讨论】:

  • 更好的方法通常是 SOAP (WCF)、REST (Web API / HttpClient) 或其他一些协议和随附的库。为什么要避免 WCF?
  • 嗯,主要是因为 WCF 不适用于 Mono。
  • Mono 支持大部分 WCF,请参阅 mono-project.com/docs/web/wcf
  • 但它并不完美。我的应用无法在带有 Mono 的 Linux 上运行。无论如何,我正在考虑类似的解决方案,在发送数据包后,使用 while(!packetReceived),然后使用方法,比如 ReceiveData(..)。要没有无限循环,请检查循环计数器是否大于预设并中断循环。那么没有别的办法了吗?
  • WCF 在 Linux 上运行良好。我们在许多产品中使用它。如果你有一个具体的问题,我会就此提出一个问题。因为你有 WCF 问题而去插座就像在你的汽车的“检查引擎”灯亮起之后制造一辆自行车。

标签: c# wcf networking


【解决方案1】:

好的,我刚刚注意到 Lidgren Network 支持同步:

// create, write data to packet and send it
var packet = new packet(...);
packet.Write(id);
server.send2Server(packet);

// this will block until a message arrives
server.MessageReceivedEvent.WaitOne();

// msg is now received
var msg = server.ReadMessage();
// process received packet below

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多