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

我正在寻找开发WCF语音聊天应用程序。

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

| Invite | | --------------------------------> | | OK | |  | | Audio flow | |  | AB 

在其他方面,同一个应用程序应具有侦听服务,因此它接收调用并将调用发送到另一台机器上的另一个相同的应用程序。 (无需额外的服务主机应用程序来接收呼叫)。

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

那么我应该使用什么样的WCF服务,以及哪种类型的绑定最适合此目的。

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

对于这样的事情,你应该真正了解WCF中双工通信的要点。 我开始这样做,我的服务上有一个SendVoice()操作合同,每次客户端将其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() == 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是回调契约。 回调使服务能够在客户端上调用某些操作,因此对于isntance,客户端将像服务器一样运行。 异步服务调用意味着您的SendVoice()将异步发布音频到每个客户端,而不是在发送新流之前等待上一个流到达客户端。

上面的代码只是一个让你开始的想法。 您应该向服务添加一些故障处理代码,以检查客户端何时断开连接并将其从订户字典中删除。 再次,您应该熟悉WCF中的异步操作调用以及回调。 此外,如果您希望在LAN中使用它,那么netTcpBindingnetTcpBinding的方法,您应该将服务配置为优化其吞吐量和并发性。 在互联网上,你想要使用支持双工的Http绑定。