异步等待TCP服务器与数据库调用的并发连接

时间:2016-02-04 11:26:50

标签: c# async-await tcpserver

我必须写多个GPS设备将同时连接的异步TCP服务器(计数: - 1000约)并将在服务器上推送一些大小小于1 Kb的数据,在响应服务器中将向它们发送简单消息包含字节接收计数,每5分钟将发生相同的过程。

服务器收到的数据是CSV格式并包含许多十进制值,服务器假设处理此数据并将其插入数据库表

在做了很多Google之后,我决定使用C#4.5异步并等待方法, 这是我第一次实现TCP服务器,我相信这不是真正高效和专业的代码,因此非常感谢任何小的小输入。我的示例代码如下

// Server starts from Here
public async void Start()
{
    IPAddress ipAddre = IPAddress.Parse("192.168.2.5");
    TcpListener listener = new TcpListener(ipAddre, _listeningPort);
    listener.Start();
    while (true)
    {
        try
        {
            var tcpClient = await listener.AcceptTcpClientAsync();
              HandleConnectionAsync(tcpClient);
        }
        catch (Exception exp)
        {

        }
    } 
  }


// Handle the incoming connection and call process data 
private async void HandleConnectionAsync(TcpClient tcpClient)
{
    try
    {
        using (var networkStream = tcpClient.GetStream())
        using (var reader = new StreamReader(networkStream, Encoding.Default))
        using (var writer = new StreamWriter(networkStream))
        {
            networkStream.ReadTimeout = 5000;
            networkStream.WriteTimeout = 5000;
            char[] resp = new char[1024];
            while (true)
            {
                var dataFromServer = await reader.ReadAsync(resp, 0, resp.Length);
                string dataFromServer1 = new string(resp);

                string status = await  ProcessDataReceived(dataFromServer1);
                if (status.Length != 0)
                    await writer.WriteAsync(status);

            }
        }
    }
    catch (Exception exp){}
}

//Process Data Function 
private async Task<string> ProcessDataReceived(string dataFromServer)
{
    List<string> values = dataFromServer.Split(',').ToList();
    // Do some calculation and rearrange the data 
    // Create the datatable and insert the data into datatable

    using (SqlBulkCopy bulkcopy = new SqlBulkCopy(_dbConn))
    {
            bulkcopy.WriteToServer(table);
    }

     return “status”;
 }

目前,我已经使用单个GPS设备对其进行了测试,并且其工作时间约为10-15分钟。而不是简单地崩溃,我非常怀疑它在多个并发连接时的工作方式。

我只是想确定我的代码中显示的基本方法是否正确?我是以正确的方式处理数据还是应该使用队列或其他数据结构进行处理?

任何输入都非常明显。

1 个答案:

答案 0 :(得分:1)

缺乏信息意味着我无法判断这是否是您的实际问题,但就问题而言,这是一个巨大的问题。

因此,您不会检查另一端是否已完成。这由a return value of 0 when calling ReadAsync表示。

  

如果当前可用的字节数小于请求的数字,则结果值可以小于请求的字节数,如果已到达流的末尾,则结果值可以是0(零)。

当检测到这种情况时,你需要离开循环,否则会发生不好的事情......

while(true)
{
    //....
    var dataFromServer = await reader.ReadAsync(resp, 0, resp.Length); //bad name!
    if(dataFromServer == 0)
    {
        break;
    }
    //....
}

通常,当您进行网络编程时,您需要捕获每个可能的异常并理解该异常的含义。从&#34;哦......它崩溃&#34;不会让你走得太远。网络内容一直都在失败,您必须通过阅读所有必须提供的诊断信息来了解它失败的原因。