【问题标题】:TCP listener data type conversionTCP监听数据类型转换
【发布时间】:2014-06-19 01:37:33
【问题描述】:

我正在开发一个带有 TCP 侦听器类的 TCP 服务器应用程序。在这里,我的服务器应用程序每秒都从客户端获取数据。

客户端以预定义的格式发送数据。接收到的数据包含 15 条消息,以“\0”分隔。例如“12\012345\012.12\0”等等。获取数据后,我拆分数据并将其转换为字符串数组。所以我有 15 个元素的字符串数组。之后,每个元素都被转换为特定的数据类型,整个记录进入数据库。

这里的数据发送/接收每秒钟发生一次。我面临的问题是我的应用程序没有每秒向客户端应用程序发送数据。

当我删除数据类型转换代码时,一切都按预期运行。但是使用转换代码需要更多毫秒,我的应用程序无法及时将数据发送回客户端。

下面是我的代码。如果我从“MapVariables”函数中删除数据类型转换代码,它运行良好。

请问有人可以帮我解决这个问题吗?

private async void ProcessClient(TcpClient tcpClient, CancellationToken ct)
    {
        try
        {
            while (!ct.IsCancellationRequested)
            {
                var stream = tcpClient.GetStream();
                var buffer = new byte[bufferSize];
                var amountRead = await stream.ReadAsync(buffer, 0, bufferSize);
                var message = Encoding.ASCII.GetString(buffer, 0, amountRead);

                string[] dataFromClient = Code.Common.SplitByLength(message, messageSize).ToArray();
                dataFromClient = dataFromClient.Select(x => ParseMessage(x)).ToArray();

                common.MapVariables(dataFromClient);

                string serverResponse = string.Join(", ", dataFromClient);
                //Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                Byte[] sendBytes = Encoding.ASCII.GetBytes(message);
                await stream.WriteAsync(sendBytes, 0, sendBytes.Length, ct);
                stream.Flush();
            }
        }
        catch (System.IO.IOException ex)
        {
            //loge exception
        }
        catch (Exception ex)
        {
            //loge exception
        }
    }

public void MapVariables(string[] variables)
    {
        Variables.Variable1 = int.Parse(variables[0]);
        Variables.Variable2 = int.Parse(variables[1]);
        Variables.Variable3 = int.Parse(variables[2]);
        Variables.Variable4 = int.Parse(variables[3]);
        Variables.Variable5 = int.Parse(variables[4]);
        Variables.Variable6 = int.Parse(variables[5]);
        Variables.Variable7 = int.Parse(variables[6]);
        Variables.Variable8 = decimal.Parse(variables[7]);
        Variables.Variable9 = decimal.Parse(variables[8]);
        Variables.Variable10 = decimal.Parse(variables[9]);
        Variables.Variable11 = decimal.Parse(variables[10]);
        Variables.Variable12 = int.Parse(variables[11]);
        Variables.Variable13 = int.Parse(variables[12]);
        Variables.Variable14 = decimal.Parse(variables[13]);
        Variables.Variable15 = decimal.Parse(variables[14]);

        InsertintoDatabase();
    }

【问题讨论】:

  • 您遇到异常了吗?你确定你的问题不在InsertintoDatabase 吗?
  • “未按时完成”是什么意思,您遇到的具体问题是什么?
  • 不,我没有收到任何异常,但我的应用程序没有在一秒钟内响应客户端请求。每个请求/回复都必须在一秒钟内完成。当我删除数据类型转换代码并将默认值插入数据库时​​,它的性能非常好,但是当我包含数据类型转换代码时,它有时会花费 2 秒,我的通信会受到干扰。我不知道,但如果有其他更好的方法,请与我分享。

标签: c# tcplistener


【解决方案1】:

查看代码,您只需将他们发送给您的内容发回,逗号分隔的除外。

您可以将您的 MapVariables(...) 调用移动到一个单独的线程中并使用它。我猜你的InsertintoDatabase 电话是真正的瓶颈。

您也可以尝试在回复后将MapVariables(...) 移动到完成,因为它看起来不会影响任何事后进行。

【讨论】:

  • 我将通过将 MapVariables(...) 的调用转移到不同的线程来再次尝试。 InsertintoDatabase 不是一个真正的瓶颈,因为我已经对其进行了调查并且它不会引起任何问题。
猜你喜欢
  • 2012-03-30
  • 2016-10-03
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多