C#TCP客户端侦听传入的消息

C#TCP客户端侦听传入的消息,c#,tcpclient,C#,Tcpclient,我有一个TCP客户端,它应该侦听来自其c&c的传入消息。消息结构应该是:缓冲区(字节数组)、类型(int/string)、id(int)和参数(string数组) 我发现此代码用于侦听传入消息: Byte[] bytes = new Byte[1024]; while (true) { // Get a stream object for reading using (NetworkStream streamFromServer = client.Ge

我有一个TCP客户端,它应该侦听来自其c&c的传入消息。消息结构应该是:缓冲区(字节数组)、类型(int/string)、id(int)和参数(string数组)

我发现此代码用于侦听传入消息:

Byte[] bytes = new Byte[1024];
while (true)
{
    // Get a stream object for reading              
    using (NetworkStream streamFromServer = client.GetStream())
    {
        int length;
        // Read incomming stream into byte arrary.                  
        while ((length = streamFromServer.Read(bytes, 0, bytes.Length)) != 0)
        {
            var incomingData = new byte[length];
            Array.Copy(bytes, 0, incomingData, 0, length);
            // Convert byte array to string message.                        
            string serverMessage = Encoding.ASCII.GetString(incomingData);
        }
    }
}

如何使用缓冲区读取消息?另外,如何将
incommingData
转换为我的消息结构?

从incommingData读取数据。您不需要服务器消息。您可以使用位转换器提取数据。如果字节数组是可变的,则需要包含其长度。如果您需要消息传递,而您只是在使用TCP,则由您来完成工作-TCP只提供一个字节流。它不保证一端对
Write
的每次调用都会与另一端对
Read
的调用1-1匹配。常用技术包括使用固定大小的消息或某种形式的分隔符,首先发送长度(但请注意,即使如此少量的数据也可能被分割)。或者移动到一个更高级别的TCP协议上,它为你做消息传递。如果这不仅仅是一个使用<代码> TCPcli客< /代码>的练习,那就只考虑使用WCF TCP端点,它已经很好地解决了所有这些问题。你不可能想出更好的现成的东西。