あなたの質問へのコメントが言うように、UDPまたは他のストリーミングプロトコルが通常好まれます。しかし、WCFがより多くの抽象化を提供することで、このようなことを行うのがより簡単になります。以前のソフトウェアの1つ(LAN内の複数のクライアントで使用されていたソフトウェア)にWCFとを使用してボイスチャット機能を実装しましたが、netTcpBinding
うまく機能しました(LAN内の5つのクライアントでテストしました)。 WCFがアーキテクチャを妨げているとは本当に感じていません。UDPトランスポートをサポートするWCF4.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
}
}
}
}
次に、クライアントは上記のメソッドを定期的に呼び出します。私の実装では、これを250ミリ秒ごとに設定しましたが、完全に機能しました(明らかにわずかな遅延がありました)。
上記のコードにIVoiceChatCallback
は、コールバックコントラクトがあります。コールバックにより、サービスはクライアントで何らかの操作を呼び出すことができるため、インスタンスの場合、クライアントはサーバーのように動作します。非同期サービス呼び出しはSendVoice()
、新しいストリームを送信する前に前のストリームがクライアントに到達するのを待つのではなく、すべてのクライアントに非同期でオーディオを公開することを意味します。
上記のコードは、開始するための単なるアイデアです。障害処理コードをサービスに追加して、クライアントが切断されたことを確認し、サブスクライバーディクショナリからクライアントを削除する必要があります。ここでも、コールバックだけでなく、WCFでの非同期操作の呼び出しにも慣れているはずです。また、これをLANで使用する場合は、これnetTcpBinding
が最適な方法です。スループットと同時実行性を最適化するようにサービスを構成する必要があります。インターネットでは、デュプレックスをサポートするHttpバインディングを使用する必要があります。