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