C# 将通过TCP接收的字符串与另一个字符串进行比较
我从MSDN获得了以下代码: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; //
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,有时,当我将服务器接收到的数据发送回客户端时,我会得到客户端先前发送的数据,而不是直接发送的数据。这是你前面提到的问题的症状吗。