【问题标题】:how to start a WCF voice chat application?如何启动 WCF 语音聊天应用程序?
【发布时间】:2012-07-22 00:10:18
【问题描述】:

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

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

|             Invite                | 

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

|               OK                  |

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

|                                   |

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

|            Audio flow             |

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

|               Bye                 | 

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

A                                   B

以其他方式,同一个应用程序应该有监听服务,所以它接收调用并将调用发送到另一台机器上的另一个相同应用程序。 (无需额外的服务宿主应用程序来接收调用)。

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

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

【问题讨论】:

  • 我不是该领域的专家,但我怀疑 WCF 是否适合这里。 TCP/UDP 应该是这些类型的传输的选择,尤其是 UDP,因为它不会打扰重新发送包
  • @Hasslarn 我不会使用 WCF 进行语音传输,我正在谈论使用 WCF 构建应用程序。

标签: c# wcf


【解决方案1】:

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

对于这样的事情,您应该真正了解 WCF 中双工通信的要点。我这样做的方式是,我的服务上有一个SendVoice() 操作合同,每次客户端将他们的音频流发送到服务时,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 Binding。

【讨论】:

  • 感谢您的出色回答,我的便携式应用程序可以同时成为自托管和客户端吗?或者我必须制作两个独立的应用程序(客户端/自托管服务)?
  • @Mur Haf Soz,我不确定我是否理解,想多了解一下 eleboarte 吗?您的意思是您的服务主机也可以是客户端吗?当然为什么不。我的想法是拥有一个“主”服务,负责以回调的形式将每个客户端流发送到另一个客户端,因此每个客户端将他们的语音发送到主服务,然后主服务将在每个客户端上调用一个回调客户端(基本上播放从服务接收到的音频流)。如果您希望我更具体,我可以更新我的答案。
  • 是的,我很想知道更多。
猜你喜欢
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2014-11-03
相关资源
最近更新 更多