TCP メッセージ フレーミングを処理する方法の例をあらゆる場所で探しています。NetworkStreams が StreamReader または StreamWriter オブジェクトに渡され、'\n' で区切られたメッセージに ReadLine または WriteLine メソッドを使用する例を数多く見てきました。私のアプリケーション プロトコルには「\n」で終わるメッセージが含まれているため、NetworkStream が適しているようです。ただし、これらすべてを非同期ソケットと組み合わせて処理する適切な方法に関する具体的な例は見つかりません。以下で ReceiveCallback() が呼び出された場合、NetworkStream および StreamReader クラスを実装してメッセージのフレーミングを処理するにはどうすればよいですか? 私が読んだことによると、1 回の受信で 1 つのメッセージの一部を取得し、次の受信で残りのメッセージ (「\n」を含む) を取得する場合があります。これは、あるメッセージの終わりと次のメッセージの一部を取得できるということですか? 確かに、これを処理する簡単な方法があるはずです。
次のコードがあります。
private void StartRead(Socket socket)
{
try
{
StateObject state = new StateObject();
state.AsyncSocket = socket;
socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
catch (SocketException)
{
m_Socket.Shutdown(SocketShutdown.Both);
Disconnect();
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
StateObject state = (StateObject)ar.AsyncState;
int bytes_read = state.AsyncSocket.EndReceive(ar);
char[] chars = new char[bytes_read + 1];
System.Text.Decoder decoder = System.Text.Encoding.UTF8.GetDecoder();
int charLength = decoder.GetChars(state.Buffer, 0, bytes_read, chars, 0);
String data = new String(chars);
ParseMessage(data);
StartRead(state.AsyncSocket);
}
catch (SocketException)
{
m_Socket.Shutdown(SocketShutdown.Both);
Disconnect();
}
}