【问题标题】:TCP message does not equal to what is sent in C#. How do I make it so it is?TCP 消息不等于 C# 中发送的消息。我怎样才能做到这一点?
【发布时间】:2021-10-26 11:20:18
【问题描述】:

当我将消息发送到客户端并尝试使用 if 语句检查它时,它不等于我从服务器发送的消息。

我想做的是:我想发送关键字(这里是便便)并在客户端使用 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);
    } 

【问题讨论】:

  • TCP/IP 正在流式传输,因此您不能依赖完整的消息接收

标签: c# tcp tcpclient tcplistener


【解决方案1】:

您的代码的问题在于您遍历了写入接收数据的字节数组。因此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
}

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

【讨论】:

  • 嘿,谢谢,它(部分)有效,当我发送便便消息时,它会发送垃圾邮件“执行便便”。在控制台中 4 次而不是一次。如果您能帮我解决,我会将其标记为解决方案。
  • 我猜你的 Console.WriteLine 调用仍在循环内?你可以摆脱循环。
  • 太好了,谢谢您,先生,您帮了我很大的忙! :)
  • 很高兴能帮上忙!
猜你喜欢
  • 2011-01-02
  • 2016-11-03
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多