私はRxに少し慣れていないので、それを通して自分の道を学んでいます。私はそこにたくさんの例をチェックしましたが、どれも私のニーズに合いません。
シナリオ:1つのソケットサーバーソケットがあります(TCPListenerオブジェクトではなく単純なソケットオブジェクトを使用して作成されています)。このサーバーソケットに複数のクライアント(TCPClientではなくクライアントソケット)が接続されています。BeginReceiveおよびEndReceive非同期操作に「FromAsyncPattern」演算子を使用して、Rx(リアクティブ拡張)を使用してクライアントソケットから送信されたメッセージを取得しようとしています。
バッファ内のメッセージの取得をほぼ開始しました。ただし、問題は、バッファが前の操作から受信した同じメッセージを返すか、現在と前の受信操作からのコンテンツが混在することです。
使用されるコードは次のとおりです。
private void ReceiveMessageFromClient(Socket socket)
{
try
{
if (socket != null)
{
byte[] buffer = new byte[400];
var functionReceiveSocketData = Observable.FromAsyncPattern
<byte[], int, int, SocketFlags, int>(socket.BeginReceive, socket.EndReceive);
Observable.Defer(() =>
functionReceiveSocketData(buffer, 0, 400, SocketFlags.None)
).Repeat().Subscribe(onNext: x => OnMessageReceived(buffer));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
OnMessageReceivedメソッドは、メッセージ受信イベントを発生させ、さらに処理するためにバッファーを他のクラスに送信するための単なるデリゲートです。
問題: メッセージを取得するたびに同じバッファが使用されます。以前に受信したバッファからメッセージをクリーンに受信するにはどうすればよいですか。
-メッセージを部分的に受信し、次のメッセージが実際にはこの同じメッセージの一部である場合はどうすればよいですか。
素晴らしいと思われるいくつかのコードスニペットで上記の問題を解決するのを手伝ってください。この質問を投稿する理由は、これまでに行った実装でTCPListenerを使用しているためであり、ここでの制約はソケットオブジェクトを使用することです:(
前もって感謝します。