He estado buscando ejemplos en todo el mundo sobre cómo tratar el encuadre de mensajes TCP. Veo muchos ejemplos en los que NetworkStream pasa a un objeto StreamReader o StreamWriter y luego utiliza los métodos ReadLine o WriteLine para los mensajes delimitados '\ n'. Mi protocolo de aplicación contiene mensajes que terminan en '\ n', así que NetworkStream parece ser el camino a seguir. Sin embargo, no puedo encontrar ejemplos específicos 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 encuadre de mensajes? Según lo que he leído, puedo obtener parte de un mensaje en una recepción y el resto del mensaje (incluido el '\ n') en la próxima recepción. ¿Esto significa que podría obtener el final de un mensaje y parte del siguiente? Sin duda, debe haber una manera más fácil de manejar esto..NET pregunta sobre operaciones de socket asíncronas y estructura de mensaje
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();
}
}
FYI, no hay tal cosa como "C# .NET". El idioma se llama "C#". –
¡Gracias por informarme! – Andrew