C#Tcp Listener接受多个连接但没有被淹没?

时间:2010-08-19 23:26:06

标签: c# multithreading listener

我正在创建我的第一个应用程序它的一个小服务器。我只是想知道什么是接受多个连接但不被淹没的最佳方式,比如10个连接中的10个连接然后如果被淹没关闭听众。线程或线程池是否可以帮助我做到这一点。

我添加了Threadpool但不确定我应该如何将它用于我的应用程序。

请查看下面的代码,了解我需要做些什么才能确保安全并且不会被淹没。

由于

class Listener
    {
        public static TcpListener _listener;
        private static TcpClient _client;
        private static NetworkStream _clientStream;

        public Listener(string ip, Int32 port)
        {
            ThreadPool.SetMaxThreads(50, 100);
            ThreadPool.SetMinThreads(50, 50);


            // Set the TcpListener IP & Port.

            IPAddress localAddr = IPAddress.Parse(ip);
            _listener = new TcpListener(localAddr, port);
        }

        public void Start()          // Run this on a separate thread, as
        {                            // we did before.
            _listener.Start();

            Console.WriteLine("Starting server...\n");
            Console.WriteLine("Listening on {0}:{1}...", Globals._localIP, Globals._port);

            while (Globals._Listen)
            {
                try
                {

                    if (!_listener.Pending())
                    {
                        Thread.Sleep(500); // choose a number (in milliseconds) that makes sense
                        continue; // skip to next iteration of loop
                    }

                    Globals._requestCounter += +1;
                    // Get client's request and process it for web request.
                    ProcessRequest();

                }
                catch (SocketException e)
                {
                    // Listener Error.

                }  

                catch (InvalidOperationException er)
                {


                }
            }

            _listener.Stop();

        }

        public static void Stop()
        {
            Globals._Listen = false;

        }
}

    static void Main(string[] args)
    {

        // Set listener settings.
        var server = new Listener(Globals._localIP, Globals._port);

        // Start the listener on a parallel thread:
        Thread listenerThread = new Thread(server.Start);
        listenerThread.Start();

        Thread.Sleep(500);
}

1 个答案:

答案 0 :(得分:1)

对于.NET中的TCP,我强烈建议使用WCF,而不是尝试自己动手。根据您的需要,有一个“TCP端口共享服务”,您只需启用它即可。此外,像限制,消息大小限制等内容都已经完成,您只需配置它即可。还有多种方式可以使用WCF net.tcp,它可以进行流式传输,点对点,全双工等,所以很少有你需要自己动手的方案。