Pergunta do .NET sobre operações de soquete assíncronas e enquadramento de mensagens

Estive procurando em todos os lugares exemplos de como lidar com o enquadramento de mensagens TCP. Vejo muitos exemplos em que os NetworkStreams são transmitidos para um objeto StreamReader ou StreamWriter e, em seguida, uso os métodos ReadLine ou WriteLine para mensagens delimitadas '\ n'. Meu protocolo de aplicativo contém mensagens terminadas em '\ n', portanto o NetworkStream parece ser o caminho a seguir. No entanto, não consigo encontrar exemplos específicos sobre a maneira correta de lidar com tudo isso em combinação com soquetes assíncronos. Quando ReceiveCallback () é chamado abaixo, como implemento as classes NetworkStream e StreamReader para lidar com o enquadramento de mensagens? De acordo com o que li, posso receber parte de uma mensagem em um recebimento e o restante da mensagem (incluindo o '\ n') no próximo recebimento. Isso significa que eu poderia receber o final de uma mensagem e parte da próxima mensagem? Certamente, deve haver uma maneira mais fácil de lidar com iss

Eu tenho o seguinte 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();
        }
    }

questionAnswers(3)

yourAnswerToTheQuestion