gpt4 book ai didi

c# - 如何确保我不会丢失来自 TCP 的数据?

转载 作者:可可西里 更新时间:2023-11-01 02:50:30 28 4
gpt4 key购买 nike

如果我问的是以前问过的问题,我很抱歉。

我正在开发一个程序来读取通过 TCP 接收的数据并使用 StreamReader,但我只是找不到如何确保不会遗漏任何数据的方法。有没有办法创建一个中间缓冲区来从那里读取或类似的东西?

以下是我为接收数据并将其写入文本框而创建的方法:

public static void Connect(string IP, string port)        
{
try
{
client = new TcpClient();
IPEndPoint IP_End = new IPEndPoint(IPAddress.Parse(IP), int.Parse(port));
client.Connect(IP_End);
if (client.Connected)
{
connected = "Connected to Exemys!" + "\r\n";
STR = new StreamReader(client.GetStream());
bgWorker = true;
}
}
catch (Exception x)
{
MessageBox.Show(x.Message.ToString());
}
}

-

public static void MessageReceiving(TextBox textBox)
{
try
{
string values =Conection.STR.ReadLine();
textBox.Invoke(new MethodInvoker(delegate () { textBox.AppendText("Exemys : " + values.Substring(2) + Environment.NewLine); }));
try
{
string messagetype = values.Substring(5, 1);
string ID = values.Substring(3, 2);
string checksum = values.Substring(values.Length - 2, 2);
if (checksum == CalcularChecksum(values.Substring(3, values.Length - 5)))
{
if (messagetype == "N")
{
if (ID == "01")
{
ID1 = values.Substring(3, 2);
messagetype1 = values.Substring(5, 1);
capacity1 = values.Substring(6, 1);
pressure1 = values.Split(',')[1];
sequencetime1 = values.Split(',')[2];
runstatus1 = values.Split(',')[3];
mode1 = values.Split(',')[4].Substring(0, 1);
checksum1 = CalcularChecksum(values.Substring(3, values.Length - 5));
}
if (ID == "02")
{
ID2 = values.Substring(3, 2);
messagetype2 = values.Substring(5, 1);
capacity2 = values.Substring(6, 1);
pressure2 = values.Split(',')[1];
sequencetime2 = values.Split(',')[2];
runstatus2 = values.Split(',')[3];
mode2 = values.Split(',')[4].Substring(0, 1);
checksum2 = CalcularChecksum(values.Substring(3, values.Length - 5));
}
}
}

}
catch(Exception x)
{
MessageBox.Show(x.Message.ToString());
}
}
catch (Exception)
{
MessageBox.Show("Client disconnected.");
}
}

编辑:我想问的是如何在继续接收之前始终处理整个数据?这就是问题所在。

最佳答案

TCP 流是字节流,当套接字被您或远程对等方关闭或由于网络问题而中断时结束。为了从流中获取所有内容,您需要在循环中调用 StreamReader.ReadLine 方法进入缓冲区,直到出现某些停止条件。

...
try
{
while(true)
{
...
input = STR.ReadLine();
if (input == <some stop condition>)
break;
...
}
}
...

这是一个高度简化的示例。带有部分缓冲区处理的 TCP 读取可能是一个复杂的野兽,因此如果您要做的不仅仅是一些业余项目,我建议您使用库或框架。

关于c# - 如何确保我不会丢失来自 TCP 的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46790827/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com