C# TCP客户端上可能的数据丢失?

C# TCP客户端上可能的数据丢失?,c#,asynchronous,barcode,tcpclient,networkstream,C#,Asynchronous,Barcode,Tcpclient,Networkstream,我正在为生产线写一些代码。特别是我需要将一些条形码阅读器集成到生产线中 由于许多(错误的)原因,我不得不像你即将看到的那样结束。 而且,在我写这篇文章的时候,我是这个领域的新手 问题:有时,阅读器读取代码(并通过ftp发送图像),但我的软件中没有数据,我需要了解原因 这就是如何初始化我的读卡器(我有多个读卡器,每个读卡器具有不同的IP,但具有相同的端口) 这是我的主要方法: try { object _lockObj = new object(); using (TcpClien

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

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

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

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

这是我的主要方法:

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);
}
试试看
{
对象_lockObj=新对象();
使用(TcpClient client=server.EndAcceptTcpClient(res))
{
int i;
server.BeginAcceptTcpClient(HandleAsyncConnection,server);
字符串地址=client.client.RemoteEndPoint.ToString();
字符串senderIp=address.Split(“:”)[0];
NetworkStream=client.GetStream();
字节[]字节=新字节[2048];
而((i=stream.Read(bytes,0,bytes.Length))!=0)
{
log.Debug(“启动”);
锁
{
log.Debug(“锁”);
StringBuilder sb=新的StringBuilder(string.Empty);
string rawCode=string.Empty;
bool isCrFound=false;
foreach(字节c,以字节为单位,其中(x=>x!=0))
{
如果(c!=(char)13&&!isCrFound)
{
if(c==(char)29)
{
某人加上(“”);
}
其他的
sb.附加(转换为c);
}
其他的
{
isCrFound=true;
}
}
rawCode=sb.ToString();
Debug(“来自{0}->{1}的原始代码”,senderIp,rawCode);
if(rawCode.StartsWith(“ERROR”,StringComparison.InvariantCultureIgnoreCase))
{
Debug(“运算符-从{1}读取代码{0}”、rawCode、senderIp的错误);
}
其他的
{
//过程代码
}
log.Debug(“结束”);
}
log.Debug(“解锁”);
}
}
}
捕获(例外情况除外)
{
错误(“异步连接操作错误:{0},堆栈:{1}”,例如Message,例如StackTrace);
}
所以基本上每次传感器触发时,数据都会被发送到我的插座。 在线路开始加速之前(比如3/4码/秒),这种方法工作得很好;这就是数据丢失的时候

现在,我不知道问题在哪里。可能是设备,我的实现,资源管理(字节数组是1024,我还得试试2048) 任何帮助都将不胜感激

谢谢

编辑:

  • 为了简洁起见,我已经剥去了一些原木
  • 我需要一个锁,因为当一个传感器触发的距离太近时,消息会重叠(这增加了不同的业务原因)
  • 当我丢失代码时,我的日志中没有任何内容;日志通常如下所示:
    • 开始
    • 很多东西
    • 结束
    • 解锁
丢失的代码不会在我的日志上留下任何痕迹。。。所以我不认为这与丢弃的数据有关


我想知道的是,在像我这样的环境中,是否有一种方法可以更好地完成这类工作。

为它添加更多调试,无论是针对端点还是针对这一点。我没有阅读过您的代码,但不要忘记,您不能保证发送的两条单独的消息作为两条单独的消息到达。在这个层次上,它不是基于数据包的,而是字节流。TCP不是消息,而是字节流。如果您想要消息,则由您在TCP上实现这些消息,或者转移到为您实现这些消息的更高级别协议。您需要注意
读取的返回值
——它告诉您缓冲区中已放置了多少字节。你不能假设缓冲区的全部内容都是有效的,并且与你最近的
Read
调用相关。除此之外,也不能保证一条消息会在一次“Read()”中到达。顺便说一句,锁定局部变量似乎没有用。
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);
}