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