如果我之前问过什么,我很抱歉。
我正在开发一个程序,可以读取通过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/

10-11 15:17
查看更多