繁体   English   中英

每个TcpCLient都有新线程-或获取100个以上客户端的方法是什么

[英]New thread for every TcpCLient - or what is way to get 100+ clients

我编写WPF应用程序。 应用程式的作用是什么-只需侦听来自GPS追踪器的数据即可。

问题是-我不知道如何处理100多个设备。 我的意思是-现在我喜欢:

 {
    var serviceIP = System.Configuration.ConfigurationManager.AppSettings.Get("sericeIP");
    var servicePort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings.Get("sericePort"));
    var dispatcher = Dispatcher.CurrentDispatcher;
    IPAddress localAddr = IPAddress.Parse(serviceIP);
    _client = new TcpListener(localAddr, servicePort);
    _client.Start();
    new Thread(() =>
    {
        while (true)
        {
            TcpClient tcpClient = _client.AcceptTcpClient();
            new Thread(() => AcceptClient(tcpClient, dispatcher)).Start();
        }
    });
}

private void AcceptClient(TcpClient client, Dispatcher dispatcher)
{
    client.ReceiveTimeout = 13000;
    while (client.Connected)
    {
        try
        {
            NetworkStream nwStream = client.GetStream();
            byte[] buffer = new byte[client.ReceiveBufferSize];
            int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
            string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);

            // My logic
        }
        catch (Exception ex)
        {  }
    }
}

对于1台设备来说还可以-但是现在我认为100-500-1000台设备会发生什么......... 1000个线程会杀死机器-因此我不知道哪种方法更好地聆听大量设备

您需要使用异步编程。 有几篇文章可以帮助您做到这一点。 MSDN就是一个例子 使用异步,您不需要自己分配线程。 .NET会解决这个问题。 当操作系统正在等待IO操作时,所有线程都将被释放。 因此,更少数量的线程可以处理您的连接。

如果要从1000个设备接收数据,为什么要在客户端应用程序中进行数据处理? 关闭WPF应用程序时,设备应该做什么?

最好在Windows服务中接收信息并将信息存储在数据库中。 这样,您还可以返回并分析所有收到的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM