4

WCF ボイス チャット アプリケーションの開発を検討しています。

WCF サービスを使用してアプリケーションをビルドしたい

|             Invite                | 

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

|               OK                  |

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

|                                   |

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

|            Audio flow             |

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

|               Bye                 | 

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

A                                   B

他の方法では、同じアプリケーションがリッスン サービスを持つ必要があるため、呼び出しを受信し、別のマシン上の別の同じアプリケーションに呼び出しを送信します。(呼び出しを受信するための追加のサービス ホスト アプリケーションは必要ありません)。

音声の転送にはソケットなどの特定のプロトコルを使用する必要があるかもしれませんが、後で確認します。

したがって、どの種類の WCF サービスを使用する必要があり、どの種類のバインディングがこの目的に最適でしょうか。

4

1 に答える 1

3

あなたの質問へのコメントが言うように、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バインディングを使用する必要があります。

于 2012-07-22T06:39:14.827 に答える