.NET pregunta sobre operaciones de socket asíncronas y enmarcado de mensajes

He estado buscando en todas partes ejemplos sobre cómo lidiar con el encuadre de mensajes TCP. Veo muchos ejemplos en los que NetworkStreams se pasan a un objeto StreamReader o StreamWriter y luego utilizo los métodos ReadLine o WriteLine para '\ n' mensajes delimitados. El protocolo de mi aplicación contiene mensajes que terminan en '\ n', por lo que NetworkStream parece ser el camino a seguir. Sin embargo, no puedo encontrar ningún ejemplo específico sobre la forma correcta de manejar todo esto en combinación con sockets asíncronos. Cuando se llama a ReceiveCallback () a continuación, ¿cómo implemento las clases NetworkStream y StreamReader para tratar el marco de mensajes? De acuerdo con lo que he leído, puedo recibir parte de un mensaje en una recepción y el resto del mensaje (incluyendo el '\ n') en la próxima recepción. ¿Esto significa que podría obtener el final de un mensaje y parte del siguiente mensaje? Seguramente, debe haber una manera más fácil de manejar esto.

Tengo el siguiente código

    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();
        }
    }

Respuestas a la pregunta(3)

Su respuesta a la pregunta