私はコードを持っていました(単純なチャットアプリケーションを想定しましょう)、同期でTcpを使用しました。しかし、セットアップは難しいですが、非同期の方法の方がまったく優れているため、同期から非同期に方法を変更することにしました。しかし今、私は非同期を使用していくつかの問題に直面しています。
- バッファサイズ:ピアからバイトを取得するには、限られたサイズのバイトを考慮する必要があることを私は知っています。私は多くの記事を読みましたが、私の問題は解決していません。これに対処するための非常に単純ですが価値のないアプローチがあり、各メッセージの最後に文字を付けています。そうすれば、受信者はメッセージが完全に受信されたことを理解できます。しかし、私には別の問題があり、それが私にとって抱えている別の問題に対してこのアプローチをさらに実行することを妨げています。
次のコードで私の問題を説明しましょう:
public void Send(byte[] message, Socket connection)
{
connection.BeginSend(message,
0,
message.Length,
SocketFlags.None,
new AsyncCallback(OnSend),
connection);
}
OnSendメソッドでは、connection.EndSend(result)を使用します。ここで、resultはIAsyncResultです。しかし、次のコードのようにSendメソッドを2回呼び出すと、OnReceiveコールバックは両方を1つのメッセージとして受信します。
Send(Encoding.Unicode.GetBytes("Hello"));
Send(Encoding.Unicode.GetBytes("Bye"));
私のOnReceiveMethodはConsole.WriteLine(message);を使用します。ここで、messageはピアから受信した文字列です。同期方法を使用した出力は、
こんにちは
さよなら
しかし、非同期的に私はそれを2つではなく1つのメッセージとして受け取るので、印刷されます
こんにちはさようなら
よろしくお願いいたします。PeymanMortazavi