Вопрос .NET об асинхронных операциях сокета и кадрировании сообщений

Я везде искал примеры того, как работать с кадрами сообщений TCP. Я вижу много примеров, когда NetworkStreams передаются в объект StreamReader или StreamWriter, а затем используют методы ReadLine или WriteLine для ' \ n 'сообщения с разделителями. Протокол моего приложения содержит сообщения, заканчивающиеся на '\ n', поэтому NetworkStream, похоже, подходит. Однако я не могу найти конкретных примеров того, как правильно обрабатывать все это в сочетании с асинхронными сокетами. Когда ниже вызывается ReceiveCallback (), как мне реализовать классы NetworkStream и StreamReader для обработки фреймов сообщений? Согласно тому, что я прочитал, я могу получить часть одного сообщения в одном приеме, а остальную часть сообщения (включая '\ 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();
        }
    }
9
задан Jason Down 18 May 2011 в 16:20
поделиться