C# 将通过TCP接收的字符串与另一个字符串进行比较

C# 将通过TCP接收的字符串与另一个字符串进行比较,c#,tcp,C#,Tcp,我从MSDN获得了以下代码: using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; class MyTcpListener { public static void Main() { TcpListener server = null; try { Int32 port = 13000; //

我从MSDN获得了以下代码:

using System;       
using System.IO;      
using System.Net;
using System.Net.Sockets;
using System.Text;

class MyTcpListener
{
public static void Main()
{
    TcpListener server = null;
    try
    {

        Int32 port = 13000; // Set the TcpListener on port 13000.
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");


        server = new TcpListener(localAddr, port); // TcpListener server = new TcpListener(port);
        server.Start(); // Start listening for client requests.

        // Buffer for reading data
        Byte[] bytes = new Byte[256];
        String data = null;

        // Enter the listening loop.
        while (true)
        {
            Console.Write("Waiting for a connection... ");

            // Perform a blocking call to accept requests.
            // You could also user server.AcceptSocket() here.
            TcpClient client = server.AcceptTcpClient();
            Console.WriteLine("Connected!");

            data = null;
            NetworkStream stream = client.GetStream();// Get a stream object for reading and writing

            int i;


            while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)  // Loop to receive all the data sent by the client.
            {     
               data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); // Translate data bytes to a ASCII string.
                Console.WriteLine("Received: {0}", data);        
                data = data.ToUpper();// Process the data sent by the client.

                byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

                stream.Write(msg, 0, msg.Length); // Send back a response.
                Console.WriteLine("Sent: {0}", data);


                if(data == "STOP")
                {
                    Console.WriteLine("Stop command Received.");
                    Console.ReadKey();
                    Environment.Exit(0);
                }


                Console.WriteLine(data.Length);

            }
            client.Close(); // Shutdown and end connection
        }
    }
    catch (SocketException e)
    {
        Console.WriteLine("SocketException: {0}", e);
    }
    finally
    {
        server.Stop();// Stop listening for new clients.
    }

    Console.WriteLine("\nHit enter to continue...");
    Console.Read();
}
}
除了我插入的以下行:

            if(data == "STOP")
            {
                Console.WriteLine("Stop command Received.");
                Console.ReadKey();
                Environment.Exit(0);
            }
我通过tcp客户端发送了一个字符串“STOP”。但是,在服务器中,将接收到的字符串“STOP”与“if block”中的“STOP”进行比较是没有用的,即,该块中没有执行任何内容


这种方法的实际错误是什么?我应该做哪些更改才能正确比较字符串?

如果您是通过WriteLine(vs.Write)发送文本,您得到的字符串将不是“STOP”,而是“STOP\r\n”,因此您需要修剪()字符串以检查是否相等

data.Trim() == "STOP" 

如果您是通过WriteLine发送文本(vs.Write),则得到的字符串将不是“STOP”,而是“STOP\r\n”,因此您需要修剪()字符串以检查是否相等

data.Trim() == "STOP" 
如果不能解决您的问题,那么您的代码还有第二个主要问题

您的代码不能保证您不会在一次读取中获得
ST
,在下一次读取中获得
OP
。允许将单个发送拆分为多个读取,并允许将多个发送合并为一个读取。因此,调用read函数时,发送
Test
然后
STOP
可能会显示为
TestSTOP

您需要向代码中添加额外的逻辑,以告知一条消息何时在接收端停止,另一条消息何时在接收端开始。这将被调用,为了使添加到程序中的内容生效,您需要将该逻辑添加到程序中。

如果无法解决您的问题,则代码将出现第二个主要问题

您的代码不能保证您不会在一次读取中获得
ST
,在下一次读取中获得
OP
。允许将单个发送拆分为多个读取,并允许将多个发送合并为一个读取。因此,调用read函数时,发送
Test
然后
STOP
可能会显示为
TestSTOP


您需要向代码中添加额外的逻辑,以告知一条消息何时在接收端停止,另一条消息何时在接收端开始。这将被调用,为了使添加到程序中的内容正常工作,您需要将该逻辑添加到程序中。

如果确实需要,您应该能够使用调试器逐步完成代码,并转到
if(data==“STOP”)
行,查看问题的原因。您确实需要,您应该能够使用调试器单步执行代码到
if(data==“STOP”)
行,并查看导致问题的原因。只是想知道,为什么会添加接收到的字符串\r\n。有目的吗?否则,另一方怎么知道他们已经收到了全部信息?@Programmingorse这就是我在回答中提到的信息框架。您会一直阅读直到看到一个\r\n,然后一旦点击其中一个,您就会开始处理,以查看消息是否符合您的预期。正在发送的代码是在正在发送的消息末尾附加\r\n的代码(可能使用WriteLine函数)。这是好是坏取决于你想做什么。正如@Scott所提到的,无法100%保证您发送的内容将以相同的顺序接收(例如,“测试”然后“停止”可能会作为“测试停止”接收,这取决于许多外部因素[尽管,您很可能会在测试时看到它像预期的那样出现])。因此\r\n可以帮助您拆分消息(假设消息本身没有\r\n)@BenAbraham,有时,当我将服务器接收到的数据发送回客户端时,我会得到客户端先前发送的数据,而不是直接发送的数据。这是您前面提到的问题的一个症状。我只想知道,为什么要将收到的字符串添加到\r\n中。有目的吗?否则,另一方怎么知道他们已经收到了全部信息?@Programmingorse这就是我在回答中提到的信息框架。您会一直阅读直到看到一个\r\n,然后一旦点击其中一个,您就会开始处理,以查看消息是否符合您的预期。正在发送的代码是在正在发送的消息末尾附加\r\n的代码(可能使用WriteLine函数)。这是好是坏取决于你想做什么。正如@Scott所提到的,无法100%保证您发送的内容将以相同的顺序接收(例如,“测试”然后“停止”可能会作为“测试停止”接收,这取决于许多外部因素[尽管,您很可能会在测试时看到它像预期的那样出现])。因此\r\n可以帮助您拆分消息(假设消息本身没有\r\n)@BenAbraham,有时,当我将服务器接收到的数据发送回客户端时,我会得到客户端先前发送的数据,而不是直接发送的数据。这是你前面提到的问题的症状吗。