我一直在寻找有关如何处理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();
} …Run Code Online (Sandbox Code Playgroud)