服务器中收到的消息不准确
Inaccurate received message in the server
我在客户端-服务器中接收消息时遇到问题。我已经设置了一个用于测试的默认字符串。它很好地接收了消息,但在发送第二个循环时将字符串粘在一起。我该怎么办?
这是代码
发送数据(客户端)
NetworkStream networkStream = tcpclnt.GetStream();
String data = "";
for (int i = 0; i < 4; i++)
{
data = " output here";
if (networkStream.CanWrite)
{
var bytes = Encoding.ASCII.GetBytes(data);
networkStream.Write(bytes, 0, bytes.Length);
networkStream.Flush();
}
}
这里是当它收到数据时(服务器)
private void recieveData()
{
NetworkStream nStream = tcpClient.GetStream();
while (!stopReceiving)
{
if (nStream.CanRead)
{
byte[] buffer = new byte[1024];
var bytesRead = nStream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0) recvDt = Encoding.ASCII.GetString(buffer, 0, bytesRead);
bool f = false;
f = recvDt.Contains("+@@+");
if (f)
{
string d = "+@@+";
recvDt = recvDt.TrimStart(d.ToCharArray());
clientDis();
stopReceiving = true;
}
else
{
this.Invoke(new rcvData(addHere));
}
}
Thread.Sleep(1000);
}
}
public void addHere()
{
if (recvDt != null && recvDt != "")
{
output.Text += "Received Data: " + recvDt;
recvDt = null;
}
}
输出看起来像这样
您假设 TCP 会保留您的消息。它不是。 TCP 提供无边界的字节流。您可以接收任何块大小的字节,包括一个,但也可以一次包含所有块。
您需要设计一个应用程序协议,允许您将消息与字节流区分开来。也许,在消息前加上它的长度。
或者,按行发送并使用 StreamReader.ReadLine。它会为您处理。
这是一个错误:
string d = "+@@+";
recvDt = recvDt.TrimStart(d.ToCharArray());
您基本上是在删除所有字符“+@”。不是你想要的。
为什么要测试 CanRead
和 CanWrite
?众所周知,它们是正确的,即使它们是错误的,您的程序也会忽略该问题并继续无所事事。如果无论如何都无法处理结果,请不要进行这种迷信的检查。
您可能根本不应该使用 TCP。这个很难(硬。使用更高级别的技术,例如 WCF、HTTP、protobuf。
我在客户端-服务器中接收消息时遇到问题。我已经设置了一个用于测试的默认字符串。它很好地接收了消息,但在发送第二个循环时将字符串粘在一起。我该怎么办?
这是代码 发送数据(客户端)
NetworkStream networkStream = tcpclnt.GetStream();
String data = "";
for (int i = 0; i < 4; i++)
{
data = " output here";
if (networkStream.CanWrite)
{
var bytes = Encoding.ASCII.GetBytes(data);
networkStream.Write(bytes, 0, bytes.Length);
networkStream.Flush();
}
}
这里是当它收到数据时(服务器)
private void recieveData()
{
NetworkStream nStream = tcpClient.GetStream();
while (!stopReceiving)
{
if (nStream.CanRead)
{
byte[] buffer = new byte[1024];
var bytesRead = nStream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0) recvDt = Encoding.ASCII.GetString(buffer, 0, bytesRead);
bool f = false;
f = recvDt.Contains("+@@+");
if (f)
{
string d = "+@@+";
recvDt = recvDt.TrimStart(d.ToCharArray());
clientDis();
stopReceiving = true;
}
else
{
this.Invoke(new rcvData(addHere));
}
}
Thread.Sleep(1000);
}
}
public void addHere()
{
if (recvDt != null && recvDt != "")
{
output.Text += "Received Data: " + recvDt;
recvDt = null;
}
}
输出看起来像这样
您假设 TCP 会保留您的消息。它不是。 TCP 提供无边界的字节流。您可以接收任何块大小的字节,包括一个,但也可以一次包含所有块。
您需要设计一个应用程序协议,允许您将消息与字节流区分开来。也许,在消息前加上它的长度。
或者,按行发送并使用 StreamReader.ReadLine。它会为您处理。
这是一个错误:
string d = "+@@+";
recvDt = recvDt.TrimStart(d.ToCharArray());
您基本上是在删除所有字符“+@”。不是你想要的。
为什么要测试 CanRead
和 CanWrite
?众所周知,它们是正确的,即使它们是错误的,您的程序也会忽略该问题并继续无所事事。如果无论如何都无法处理结果,请不要进行这种迷信的检查。
您可能根本不应该使用 TCP。这个很难(硬。使用更高级别的技术,例如 WCF、HTTP、protobuf。