TcpClient可能丢失数据?

时间:2018-04-20 08:36:36

标签: c# asynchronous barcode tcpclient networkstream

我正在为生产线编写一些代码。特别是我需要将一些条形码阅读器集成到该行中。

由于许多(错误的)原因,我不得不像你将要看到的那样结束。 此外,在我写这篇文章时,我是那个领域的新手。

问题:有时,读者会读取代码(并通过ftp发送图像),但我的软件中没有数据,我需要了解原因。

这是如何初始化我的阅读器(我有多个阅读器,每个阅读器具有不同的IP但相同的端口)

server = new TcpListener(IPAddress.Any, scannerPort);
server.Start();

Thread thread = new Thread(() =>
{
    log.Debug("Waiting for scanner connection");
    server.BeginAcceptTcpClient(HandleAsyncConnection, server);
});
thread.Start();

这是我的主要方法:

try
{
    object _lockObj = new object();
    using (TcpClient client = server.EndAcceptTcpClient(res))
    {
        int i; 
        server.BeginAcceptTcpClient(HandleAsyncConnection, server);
        string address = client.Client.RemoteEndPoint.ToString();
        string senderIp = address.Split(':')[0];

        NetworkStream stream = client.GetStream();
        Byte[] bytes = new Byte[2048];

        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        {
            log.Debug("Start");
            lock (_lockObj)
            {
                log.Debug("Lock");
                StringBuilder sb = new StringBuilder(string.Empty);
                string rawCode = string.Empty;
                bool isCrFound = false;

                foreach (byte c in bytes.Where(x => x != 0))
                {
                    if (c != (char)13 && !isCrFound)
                    {
                        if (c == (char)29)
                        {
                            sb.Append("<GS>");
                        }
                        else
                            sb.Append(Convert.ToChar(c));
                    }
                    else
                    {
                        isCrFound = true;
                    }
                }
                rawCode = sb.ToString();
                log.Debug("Raw code from {0} -> {1}", senderIp, rawCode);
                if (rawCode.StartsWith("ERROR", StringComparison.InvariantCultureIgnoreCase))
                {
                    log.Debug("Operator - Errore reading code {0} from {1}", rawCode, senderIp);
                }
                else
                {
                    //Process code
                }
                log.Debug("End");
            }
            log.Debug("Unlock");
        }
    }
}
catch (Exception ex)
{
    log.Error("Error on the async connect operation: {0}, Stack: {1}", ex.Message, ex.StackTrace);
}

所以基本上每次传感器触发时,数据都会发送到我的套接字。 这很好用,直到线开始加速(如3/4码/秒);那就是数据丢失发生的时候。

现在,我不知道问题出在哪里。可能是devide,我的实现,资源管理(字节数组是1024,我仍然要尝试2048) 任何帮助将不胜感激。

由于

编辑:

  • 我已经删除了一些日志以简洁
  • 我需要锁定,因为当传感器触发得太靠近另一个时,消息会重叠(这会增加不同的商业原因)
  • 当我丢失代码时,我的日志中没有任何内容;日志,通常看起来像:
    • 启动
    • 锁定
    • 很多东西
    • 解锁

丢失的代码不会在我的日志中留下任何痕迹......所以我不认为它与丢弃的数据有关。

我想知道在我这样的环境中是否有办法更好地完成这类工作。

0 个答案:

没有答案