TCP 消息不等于在 C# 中发送的消息。我该怎么做呢?

TCP message does not equal to what is sent in C#. How do I make it so it is?

当我向客户端发送消息时,我尝试使用 if 语句检查它是否与我从服务器发送的消息相同。

我想做的是:我想发送关键字(这里是 poop)并在客户端用 if 语句检查它。 如果它找到带有 if 语句的关键字,我想执行一些代码。

例如:

客户代码:

try {
            TcpClient tcpclnt = new TcpClient();
            Console.WriteLine("Connecting.....");
            
            tcpclnt.Connect("127.0.0.1",8001);
            
            Console.WriteLine("Connected");
            
            Stream stm = tcpclnt.GetStream();
                        
            ASCIIEncoding asen= new ASCIIEncoding();
            
            
            while(true)
            {
                byte[] bb=new byte[100];
                int k=stm.Read(bb,0,100);
                for (int i=0;i<k;i++)
                {
                    var msg = Convert.ToChar(bb[i]).ToString();
                    if(msg == "poop")
                    {
                        Console.WriteLine("Poop executed.");
                    }
                }
            }
            
            
            
            
            
            
        }
        
        catch (Exception e) {
            Console.WriteLine("Error..... " + e.StackTrace);
        }

服务器代码(当控制台读取我的输入时我输入“poop”):

try {
        IPAddress ipAd = IPAddress.Parse("127.0.0.1");
         

        TcpListener myList=new TcpListener(ipAd,8001);

        myList.Start();
        
        Console.WriteLine("The server is running at port 8001...");    
        Console.WriteLine("The local End point is  :" + 
                          myList.LocalEndpoint );
        Console.WriteLine("Waiting for a connection.....");
        
        Socket s=myList.AcceptSocket();
        Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);
        
        
        
        

        ASCIIEncoding asen=new ASCIIEncoding();
        while(true)
        {
            
            Console.Write("Msg to send: ");
            var f = Console.ReadLine();
            s.Send(asen.GetBytes(f));
        }
        s.Close();
        myList.Stop();
            
    }
    catch (Exception e) {
        Console.WriteLine("Error..... " + e.StackTrace);
    } 

您的代码存在的问题是您遍历了写入接收数据的字节数组。因此,message 变量总是只包含您收到的消息的一个字母,因此永远不会是“poop”,而是“p”、“o”、“o”、“p”。要解决此问题,您可以使用 System.Text.Encoding 将字节数组转换为字符串:

byte[] bb = new byte[100];
int k = stm.Read(bb, 0, 100);
var msg = System.Text.Encoding.UTF8.GetString(bb, 0, k);

if(msg == "poop")
{
   // Do something
}

更好的解决方案是将接收到的数据写回临时数组,直到收到定义的字符串结束信号,并且只有在确定收到所有内容时才转换临时数组。