我一直在寻找如何处理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();
}
}