• ASP.NET那点不为人知的事(四)


    虽然开发中很少接触多线程,但你必须承认你离不开他。

    接着上篇博客(ASP.NET那点不为人知的事(三)),基本可以实现一个Mini版的服务器,但也有不足:

    倘若客户端飞快地连接,服务端很快被压垮。

    幸好,Socket类实现了.NET框架的异步调用模式,使用这个模式,利用线程池就可以让服务器更好的服务于到来的请求。

    重构后的版本:

    class Program
        {
            private const int ConnectionQueueLength = 4;
            private const int ListenPort = 1234;
            private const int MaxConnectionHandlers = 4;
            static void HandleConnection(IAsyncResult ar)
            {
                //AsyncResult asyncResult = (AsyncResult) ar;
                Socket listener=(Socket)ar.AsyncState;
                Socket newConnectin = listener.EndAccept(ar);
    
                byte[] msg = Encoding.UTF8.GetBytes("Hello World");
    
                newConnectin.BeginSend(msg, 0, msg.Length, SocketFlags.None, new AsyncCallback(Program.CloseConnection),
                                       newConnectin);
    
    
            }
            static void CloseConnection(IAsyncResult ar)
            {
                Socket socket = ar.AsyncState as Socket;
                if (socket!=null)
                {
                    socket.Close();
                }
            }
            
            static void Main(string[] args)
            {
                Socket listenSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
                listenSocket.Bind(new IPEndPoint(IPAddress.Any,ListenPort));
    
                listenSocket.Listen(ConnectionQueueLength);
                for (int i = 0; i < MaxConnectionHandlers; i++)
                {
                    listenSocket.BeginAccept(new AsyncCallback(Program.HandleConnection), listenSocket);    
                }
                Console.ReadKey();
            }
        }

    这样我们的服务器更加有效率,他从线程池中发送数据回去。

    注意这儿的异步调用(new AsyncCallback(Program.CloseConnection))使用了一个关闭连接的回调方法,因为为了让服务器更加高效,让侦听线程在EndSend等待是没有任何意义的,因为它将堵塞当前线程。 

    总结

    服务器阶段就结束了,相信你也对他有一定的了解了,接下来会再讲讲ASP.NET 中是怎样实现多线程的。

  • 相关阅读:
    极简Docker和Kubernetes发展史
    什么是健身
    《高效休息法》IT从业者如何高效休息
    《我们赖以生存的隐喻》文学中的面向对象
    sequelize时间自动格式化
    什么是消息队列
    node.js中this指向失效解决
    node.js的async和await
    node.js箭头函数使用
    node.js如何批量赋值
  • 原文地址:https://www.cnblogs.com/OceanEyes/p/aspnet_melodies_server_2.html
Copyright © 2020-2023  润新知