Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何启动WCF语音聊天应用程序?_C#_Wcf - Fatal编程技术网

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

C# 如何启动WCF语音聊天应用程序?,c#,wcf,C#,Wcf,我想开发一个WCF语音聊天应用程序 我想使用WCF服务来构建应用程序 | Invite | | --------------------------------> | | OK | | <-------------------------------- | | | | -----------

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

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

|             Invite                | 

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

|               OK                  |

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

|                                   |

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

|            Audio flow             |

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

|               Bye                 | 

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

A                                   B
|邀请|
| --------------------------------> |
|嗯|
|  |
|音频流|
|  |
A B
换句话说,同一应用程序应该具有侦听服务,因此它接收调用并将调用发送到另一台机器上的另一个同一应用程序。(无需额外的服务主机应用程序来接收呼叫)

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


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

正如您对问题的评论所说,UDP或其他流媒体协议通常是首选的。但是由于WCF提供了更多的抽象,这样做会更容易。我已经在之前的一款软件(该软件在局域网中被多个客户端使用)上使用WCF和
netTcpBinding
实现了语音聊天功能,它运行良好(我在局域网中用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<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
                 }
            }
        }
}
public void SendVoice(字节[]音频)
{
//在名为订阅服务器的字典中保留已连接客户端的列表
/锁定您的订户列表,以便在发送流时不修改订户列表。
锁定(订户)
{
//将接收到的语音流发送到每个客户端
foreach(订阅服务器中的var_订阅服务器)
{
if(OperationContext.Current.GetCallbackChannel()==subscriber.Key)
{
//如果发送视频的人是当前订户,则不要将视频发送给该订户
继续;
}
尝试
{
//将接收到的流异步发送到客户端
_subscriber.Key.BeginOnVoiceSendCallback(音频,onNotifyCompletedVoiceSend,_subscriber.Key);
}
捕获(例外)
{
//故障处理
}
}
}
}
然后,您的客户机会定期调用上面的方法,在我的实现中,我将其设置为每250毫秒一次,它工作得非常好(显然有一个小的延迟)

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


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

我不是这方面的专家,但我怀疑WCF是否适合这一领域。对于这些类型的传输,您应该选择TCP/UDP,尤其是UDP,因为它不会麻烦重新发送packages@Hasslarn我不会使用WCF进行语音传输,我说的是使用WCF构建应用程序。谢谢你的回答,我的便携式应用程序可以同时作为主机和客户端吗??或者我必须创建两个独立的应用程序(客户端/自主机服务)?@Mur Haf Soz,我不确定我是否理解,是否还要多做一点eleboarte?您的意思是您的服务主机也可以是客户机吗?当然,为什么不呢。我的想法是有一个“主”服务,负责以回调的形式将每个客户端流发送给另一个客户端,因此每个客户端都将其语音发送到主服务,然后主服务将调用每个客户端上的回调(基本上播放从服务接收的音频流)。如果你想让我更具体一些,我可以更新我的答案。是的,我想知道更多。