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