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
}
更好的解决方案是将接收到的数据写回临时数组,直到收到定义的字符串结束信号,并且只有在确定收到所有内容时才转换临时数组。
当我向客户端发送消息时,我尝试使用 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
}
更好的解决方案是将接收到的数据写回临时数组,直到收到定义的字符串结束信号,并且只有在确定收到所有内容时才转换临时数组。