文档章节

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

 木宛城主
发布于 2015/03/02 19:39
字数 365
阅读 1
收藏 0

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

接着上篇博客(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 中是怎样实现多线程的。

© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 222
码字总数 199010
作品 0
黄浦
[本周] 就来说说Asp.net 身份验证、授权

[本周]如约而至;时间是争取来的,这回的[本周]是把若干零碎的时间利用起来成文的,完成对Asp.net身份验证、访问授权等内容的梳理,可能漏掉的东西会比较多,漏掉的还是希望大家来补充。顺便说...

唐玄奘
2017/12/03
0
0
ASP.NET MVC 随笔汇总

ASP.NET MVC 随笔汇总 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的。 学前篇之: ASP.NET MVC学前篇之扩展方法、链式编程 ASP.NET MVC学前篇之Lambda表达式、...

jinyuan0829
2014/08/03
0
0
OSChina 技术周刊第八期 —— 10 大常见的 web 开发错误

每周技术抢先看,总有你想要的! 移动开发 【翻译】实现 iOS 上的井字游戏 前端开发 【软件】Twemoji —— Twitter 开源其完整的 Emoji 表情 【软件】LokiJS —— 高性能的 JavaScript 数据库...

OSC编辑部
2014/11/09
3.5K
5
session共享那点事

二、如何实现session的共享? 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分...

yagujj
2015/09/16
29
0
学习ASP.NET Core Razor 编程系列十七——分组

学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目...

DotNet菜园
08/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RESTful架构详解

1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主...

kitty1116
21分钟前
0
0
精通Spring Boot——第十篇:Quartz动态配置定时任务

定时任务简述 定时任务,在企业开发中尤其重要,很多业务都是需要定时任务去做的。比如说10点开售某件东西,凌晨0点统计注册人数,统计其他各种等等。这个时候不可能说让人为的去开启某个开关...

developlee的潇洒人生
23分钟前
0
0
将一些内容输出到文件中

看到一个面试题,如下: 第八题: 一个字符串将其输入到一个文件中,代码如下: <?php$a = '[{"teamId": "43", "serial": "1"},{"teamId": "1", "serial": "2"},{"teamId": "14", "serial":...

vinci321
32分钟前
0
0
nginx的简单使用:负载均衡

nginx:反向代理的服务器;用户发送请求到nginx,nginx把请求发送给真正的服务器,等待服务器处理完数据并返回,再把数据发送给用户。 nginx作为一个反向代理服务器,能缓存我们项目的静态文...

osliang
今天
2
0
网站title标题被改并被百度网址安全中心提醒的解决办法

国庆假日期间我们Sine安全接到众多网站站长求助网站标题被改导致在百度搜索中百度安全中心提醒被拦截,导致网站正常用户无法浏览网站被跳转到一些菠菜du博网站,而且很明显的一个特征就是在百...

网站安全
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部