我正在使用网络流从Windows窗体中的文本框传输数据,当读取此数据时,我将其写到控制台,而传输的数据输出正常,这似乎产生了我所不知道的空白无法识别为新行或大量空格。
我尝试使用Replace函数将空格''和换行'\ n'替换为空字符,但这似乎无法解决问题,并且读取的数据与后续数据之间仍然存在异常间隙它。
输出应显示: 约翰·多伊(John Doe)加入了
但是说:
约翰·杜(John Doe)
已加入
TcpClient clientSocket = serverSocket.AcceptTcpClient();
byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
clientSocket.GetStream().Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
string dataFromClient = Encoding.ASCII.GetString(bytesFrom);
Console.WriteLine($"{dataFromClient} joined");
答案 0 :(得分:1)
您的代码正在尝试对整个bytesFrom
数组进行解码,无论它是否包含数据。 Stream.Read
不会覆盖整个缓冲区,它只会覆盖所需的字节并返回字节数。
这意味着您第一次尝试对缓冲区进行解码时,还将尝试对它所包含的0
进行解码。您可能会在 second 时间结束,对旧数据和新数据进行解码。
您应该将代码更改为:
byte[] bytesFrom = new byte[clientSocket.ReceiveBufferSize];
using(var stream=clientSocket.GetStream())
{
var read=stream.Read(bytesFrom, 0, clientSocket.ReceiveBufferSize);
var text = Encoding.ASCII.GetString(bytesFrom,0,read);
Console.WriteLine("Actual Text: {0}",text);
}
另一个问题是Encoding.ASCII
是7位的US-ASCII代码页。该代码页中未包含的任何字符都将丢失,并由?
代替。 .NET字符串是Unicode(UTF16)。至少在服务器和客户端上至少使用UTF8编码,以避免丢失数据