Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在windows服务内无限迭代中追加到字符串_C#_Windows Services - Fatal编程技术网

C# 在windows服务内无限迭代中追加到字符串

C# 在windows服务内无限迭代中追加到字符串,c#,windows-services,C#,Windows Services,我试图迭代通过UDP接收到的每个字节,并将该字节附加到字符串(sbCardNo)中。问题是每个字节的迭代都在while循环中,这意味着一个infinate循环(如果我理解正确的话)。如何调整下面的代码以将每个字节添加到字符串中 private void DoWork() { byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8888);

我试图迭代通过UDP接收到的每个字节,并将该字节附加到字符串(sbCardNo)中。问题是每个字节的迭代都在while循环中,这意味着一个infinate循环(如果我理解正确的话)。如何调整下面的代码以将每个字节添加到字符串中

private void DoWork()
    {
        byte[] data = new byte[1024];
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8888);
        UdpClient newsock = new UdpClient(ipep);

        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);

        StringBuilder sbCardNo = new StringBuilder();

        while (true)
        {
            data = newsock.Receive(ref sender);

            sbCardNo.Append(data.GetValue(0));

            FileStream fs = new FileStream(folderPath + "\\AuthService.txt",
            FileMode.OpenOrCreate, FileAccess.Write);

            StreamWriter m_streamwriter = new StreamWriter(fs);
            m_streamwriter.BaseStream.Seek(0, SeekOrigin.End);
            m_streamwriter.WriteLine(sbCardNo);

            m_streamwriter.Flush();
            m_streamwriter.Close();
        }
    }
上述守则向我提供以下资料—

2
252
25267
2526748
252674848
25267484870
2526748487069
25267484870693
我只需要最后一行-252674870693


感谢

末尾创建文件,同时立即写入StringBuilder的所有内容,并为可能的异常处理逻辑

在本例中,在接收到字节“Z”之前读取,但如果通信的另一端发送单个字符串,或者前2个字节是将发送的字节长度,则读取效果要好得多

private void DoWork()
{
    byte ch ;
    byte[] data = new byte[1024];
    IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8888);
    UdpClient newsock = new UdpClient(ipep);

    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);

    StringBuilder sbCardNo = new StringBuilder();

    while (true)
    {
        do
        {
            data = newsock.Receive(ref sender);
            ch = data.GetValue(0)
            sbCardNo.Append(ch);
        } while (ch != 'Z') ;

        using (StreamWriter m_streamwriter = new StreamWriter( folderPath + "\\AuthService.txt"))
        {
            m_streamwriter.WriteLine(sbCardNo.toString());
        }
    }
}

“我只需要最后一句话”?最后一行与倒数第二行有何不同?您如何知道何时到达?如果发送方发送的数据报由一个字节组成,那么您需要一个“消息结束”字节,以便知道何时中断循环。更好的解决方案是让发送方在单个数据报中发送整个值。另外,查看允许您打开进行追加的。如果有帮助,则结束字节始终为3?这可能有帮助。
3
是否可能存在于除结束字节以外的任何位置?如果您知道
3
始终是最后一个字节,并且它从不存在于字符串的其余部分,那么您可以在收到
3
后读取并附加到循环中并中断。开始字节始终是2,结束字节始终是3。之间的每个字节都是两位数。它可能包含一个3,但绝不是单独的。这似乎是可行的,但由于某种原因,服务无法接受任何其他UDP命令?@MattBaughan您是否得到和期望?你能调试一下并告诉我哪一行停止工作吗?请记住,我在接收时删除了无限循环,可能您收到一个“Z”,服务停止接收?没有报告异常。该服务将继续运行,但由于没有对传入UDP进行循环检查,因此它不会向文本文件写入更多UDP字符串。Cheers@MattBaughan我刚刚添加了一个“while(true)循环”,但我认为该协议还有改进的余地完美,我所做的唯一更改是替换文件修改-FileStream fs=newfilestream(folderPath+“\\AuthService.txt”、FileMode.OpenOrCreate、FileAccess.Write);StreamWriter m_StreamWriter=新StreamWriter(fs);m_streamwriter.BaseStream.Seek(0,SeekOrigin.End);m_streamwriter.WriteLine(sbCardNo);m_streamwriter.Flush();m_streamwriter.Close();