c# - 如何启动 WCF 语音聊天应用程序?

标签 c# wcf

我想开发一个 WCF 语音聊天应用程序。

我想使用 WCF 服务来构建应用程序

|             Invite                | 

| --------------------------------> |

|               OK                  |

| <-------------------------------- |

|                                   |

| --------------------------------> |

|            Audio flow             |

| <-------------------------------- |

|               Bye                 | 

| --------------------------------> |

A                                   B

换句话说,同一个应用程序应该有监听服务,所以它接收调用并将调用发送到另一台机器上的另一个同一个应用程序。 (不需要额外的服务主机应用程序来接收调用)。

我知道也许我应该使用特定的协议(protocol),如套接字或其他协议(protocol)来传输语音,但我稍后会检查一下。

那么我应该使用哪种 WCF 服务,哪种类型的绑定(bind)最适合此目的。

最佳答案

正如对您问题的评论所说,通常首选 UDP 或其他流媒体协议(protocol)。但是随着 WCF 提供更多的抽象,做这样的事情会更容易。话虽如此,我已经使用 WCF 和 netTcpBinding 在我们以前的软件之一(该软件被 LAN 中的多个客户端使用)上实现了语音聊天功能,并且运行良好(我用 5 测试了它LAN 中的客户端),您不会真正感觉到 WCF 阻碍了体系结构。随着支持 UDP 传输的 WCF 4.5 的发布,它会变得有趣。

对于这样的事情,您应该真正了解 WCF 中双工通信的要点。我以这样的方式开始做,即我在服务上有一个 SendVoice() 操作契约(Contract),每次客户端将他们的 asudio 流发送到服务时,SendVoice() 方法将遍历订阅者列表(已连接的客户端)并在每个客户端上调用 SendVoiceCallback()。你可以从这样的事情开始:

public void SendVoice(byte[] audio)
{
    //Keep a list of connected clients in a dictionary called subscribers
    //lock your subscribers list so that it's not modified when you're in the middle of sending the stream              
        lock (subscribers)
        {
        //send the received voice stream to each client
            foreach (var _subscriber in subscribers)
            {
                if (OperationContext.Current.GetCallbackChannel<IVoiceChatCallback>() == subscriber.Key)
                {
            //if the person who sent the video is the current subscriber then don't send the video to THAT subscriber
                            continue;
                }
                try
                {
                 //Send the received stream to the client asynchronously
                            _subscriber.Key.BeginOnVoiceSendCallback(audio, onNotifyCompletedVoiceSend, _subscriber.Key);
                 }
                 catch (Exception)
                 {
                            //fault handling
                 }
            }
        }
}

然后您的客户会定期调用上述方法,在我的实现中,我将其设置为每 250 毫秒一次,并且它运行良好(显然有一点延迟)。

在上面的代码中,IVoiceChatCallback 是回调契约。回调使服务能够调用客户端上的某些操作,因此在某种程度上,客户端的行为类似于服务器。 异步服务调用意味着您的 SendVoice() 将向每个客户端异步发布音频,而不是在发送新流之前等待前一个流到达客户端。

上面的代码只是您入门的一个想法。您应该向服务添加一些故障处理代码以检查客户端何时断开连接并将它们从订阅者字典中删除。同样,您应该熟悉 WCF 中的异步操作调用以及回调。此外,如果您希望在 LAN 中使用它,那么 netTcpBinding 是可行的方法,您应该配置您的服务以优化其吞吐量和并发性。在 Internet 上,您需要使用支持双工的 Http 绑定(bind)。

关于c# - 如何启动 WCF 语音聊天应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11596804/

相关文章:

c# - WCF 中的 Provide Fault 方法接收没有详细信息的 FaultException

.net - WCF ExtensionDataObject 导致 Entity Framework 4.2 无法创建数据库

c# - MD5 是对数据进行编码还是仅对其中的 32 位字符串进行编码?

c# - 如何更改图表控件中各个列的颜色?

c# - 如何使用泛型在 C# 中将类型静态绑定(bind)在一起(如 TypeToType<T>)?

c# - 在 C# 中实现 RSA

IIS7 共享主机上的 WCF 身份验证

visual-studio-2010 - 打开 WCF 托管的 svc 文件

c# - DI 容器中的自定义生命周期管理(wcf 代理 : Unity vs CaSTLe Windsor)

c# - 您将如何获得 int 数组中最低值的索引?