Я всюду искал примеры того, как бороться с кадрированием 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();
}
}