代码改变世界

[置顶] 用c#实现通用守护进程

2011-02-12 11:55 by 田志良, 21552 阅读, 收藏, 编辑
摘要:用户指定要守护的应用程序(数量不限),该应用程序不仅包括exe可执行文件,还包括诸如jpg、txt等所有能双击打开执行的应用程序。用户设定好要守护的应用程序后,关闭应用程序(包括合法和非法关闭),该应用程序要能立即重启打开。当电脑重启时,要守护的应用程序也能自动全部打开。 阅读全文

[置顶] Socket服务器整体架构概述

2010-10-28 16:50 by 田志良, 33010 阅读, 收藏, 编辑
摘要:Socket服务器主要用于提供高效、稳定的数据处理、消息转发等服务,它直接决定了前台应用程序的性能。我们先从整体上认识一下Socket服务器,Socket服务器从架构上一般分为:网络层、业务逻辑层、会话层、数据访问层。 阅读全文

[置顶] c#实现用SQL池(多线程),定时批量执行SQL语句

2010-09-11 14:39 by 田志良, 10886 阅读, 收藏, 编辑
摘要:在实际项目开发中,业务逻辑层的处理速度往往很快,特别是在开发Socket通信服务的时候,网络传输很快,但是一旦加上数据库操作,性能一落千丈,数据库操作的效率往往成为一个系统整体性能的瓶颈。面对这问题,我们怎么办呢?好,下面我就为大家介绍一种方法:构建SQL池,分离业务逻辑层和数据访问层,让业务逻辑层从低效的数据库操作解脱,以提高系统整体性能。SQL池是SQL容器,用于存放业务逻辑层抛过来的SQL语句。特别提醒一下,SQL池是面向多线程的,所以必须对公共资源SQL采取锁机制。这里采用互斥锁,当业务逻辑层线程往SQL池中抛入SQL语句时,禁止SQL执行线程执行SQL语句,反之,当SQL执行线程执行SQL语句时,也不允许业务逻辑层线程往SQL池中抛入SQL语句。 阅读全文

[置顶] 深入探析c# Socket

2010-09-08 17:28 by 田志良, 111875 阅读, 收藏, 编辑
摘要:最近浏览了几篇有关Socket发送消息的文章,发现大家对Socket Send方法理解有所偏差,现将自己在开发过程中对Socket的领悟写出来,以供大家参考。   (一)架构   基于TCP协议的Socket通信,架构类似于B/S架构,一个Socket通信服务器,多个Socket通信客户端。Socket通信服务器启动时,会建立一个侦听Socket,侦听Socket将侦听到的Socket连接传给接受Socket,然后由接受Socket完成接受、发送消息,当Socket存在异常时,断开连接。在实际开发项目中,往往要求Socket通信服务器能提供高效、稳定的服务,一般会用到以下技术:双工通信、完成端口、SAEA、池、多线程、异步等。特别是池,用的比较多,池一般包括一下几种: 1)Buffer池,用于集中管控Socket缓冲区,防止内存碎片。 2)SAEA池,用于集中管控Socket,重复利用Socket。 3)SQL池,用于分离网络服务层与数据访问层(SQL的执行效率远远低于网络层执行效率)   (二)Send   主服务器接受Socket为一端口,客户端Socket为一端 阅读全文

[置顶] 高性能Socket设计实现

2010-08-31 14:33 by 田志良, 18201 阅读, 收藏, 编辑
摘要:因为学习的需要,要求一个高性能的Socket服务器来提供多而繁杂的客户端连接请求,参考了许多资料和各位的思想,自己琢磨出了一套方案,觉的可行,于是拿出来晒晒,希望大家一起学习改进。(这个方案的1.0版本已经贴出来了,但是由于本人觉的1.0不太完美,做了下改进,本篇讲的主要是2.0) 1.0的文章参考:http://www.cnblogs.com/niuchenglei/archive/2009/07/23/1529462.html 1.0和2.0性能上基本没有变化,只是针对某些地方做了改进性的修改,本篇主要介绍原理,并贴出部分代码,上一篇是一个Overview。 设计原则:使用.net的SocketAsyncEventArgs(原因是这个比较简单,而且性能也很好,当然要是c++的话就用IOCP了)。考虑到能快速的反应用户的连接请求我采用了连接池的技术,类似于sqlserver的连接池,当然我的“池”还不够好,为了能快速的处理接受的数据我又加入了一个缓冲区池,说白了就是给每一个连接对象事先开辟好了空间。在传输方面,为了保证数据的有效性我们采用客户端和服务器端的验证(当然也不是太复 阅读全文

LoadRunner压力测试心得总结

2013-04-18 09:25 by 田志良, 16635 阅读, 收藏, 编辑
摘要:一、虚拟用户迭代一次的时间对整个压力场景的影响。 二、File参数化的设置。 三、场景设置。 阅读全文

Asp.net四层架构设计感悟

2013-01-25 13:21 by 田志良, 3442 阅读, 收藏, 编辑
摘要:在构建Web解决方案时,一般采用四层架构:Web层、BLL层、DAL层、Model层。Web层用来实现UI,完成人机交互。相对于BLL层来说,Web层是BLL层的调用者。BLL层用来实现业务逻辑,它与Web层不同的是,Web层仅仅是实现人机界面交互,而BLL层是实现系统业务逻辑的所有功能点。DAL层用来实现数据库相关的所有操作,供BLL调用。DAL层只是实现了BLL层数据库相关的功能点,但并不等同于BLL层,BLL层是系统所有业务逻辑功能点的总集。Model层用于向Web层、BLL层、DAL层提供数据模型支持。 阅读全文

精确到秒的JQuery日期控件

2012-10-31 10:45 by 田志良, 49710 阅读, 收藏, 编辑
摘要:项目中需要用到精确到秒的日期控件,到网上搜了一下,发现有一个JQuery控件可以实现该功能---TimerPicker。但是官网上没有提供该控件的完整Demo,而且没有提供汉化包,所以自己汉化了一下,以供需要的朋友参考。 阅读全文

理解程序内存

2012-09-20 09:29 by 田志良, 1528 阅读, 收藏, 编辑
摘要:理解程序内存 来源:http://www.cnblogs.com/weiym/archive/2012/09/19/2694501.html 阅读全文

对象锁感悟

2012-07-18 14:09 by 田志良, 2215 阅读, 收藏, 编辑
摘要:1、对于一个对象,读取对象元素无须加锁,增加、修改、删除、遍历须加锁。 2、如果对象a包含另外一个对象b,针对对象a的操作只要锁住对象a,针对对象b的操作只要锁住对象b。 3、如果对象a包含对象b,对象b包含对象c,对c的操作可以锁住c,可以锁住b,也可以锁住a,至于锁哪个,据具体的业务逻辑性能要求来定。 4、有时为了防止并发覆盖,可扩大锁范围。 阅读全文

MySQL性能测试

2012-07-18 13:56 by 田志良, 1451 阅读, 收藏, 编辑
摘要:1、MySQL的操作速度(插入、修改、删除),受限于MySQL服务器的硬盘IO转速和网络IO速度。 2、MySQL数据库多用户多数据库连接并发执行插入/修改操作,每秒钟最大执行6500条记录。单用户单数据库连接,每秒钟最大执行950条记录。 阅读全文

反射调用性能比较(附源码)

2012-06-29 17:33 by 田志良, 5617 阅读, 收藏, 编辑
摘要:本文通过编写Demo,测试“传统反射”、“实例反射”、“快速反射”、“直接调用”的性能。 阅读全文

Memcached 命令简介

2012-05-23 15:28 by 田志良, 4161 阅读, 收藏, 编辑
摘要:本文简单介绍了Memcached常用的命令:add、set、replace、delete、get、gets、cas、append、prepend、flush_all。 阅读全文

如何在Windows平台下安装Memcached

2012-05-21 16:35 by 田志良, 2677 阅读, 收藏, 编辑
摘要:1、解压到指定目录,如:C:\Memcached\memcached-win32-1.4.4-14。 2、用cmd打开命令窗口,转到解压的目录,输入 “memcached.exe -d install”。 3、打开控制面板,打开服务,可以看到memcached已经在上面可,如果没有启动,则手动启动一下。 4、使用telnet命令 验证缓存服务器是否可用。开始什么都不显示,回车后输入命令 stats 查看统计信息,如下图,说明服务器运作正常。 阅读全文

LoadRunner中lrs_set_recv_timeout和lrs_set_recv_timeout2的区别和联系

2012-04-27 16:08 by 田志良, 2932 阅读, 收藏, 编辑
摘要:lrs_set_recv_timeout:执行lrs_receive命令后,等待服务器返回消息的超时时间,即:服务器的响应时间。 lrs_set_recv_timeout2:创建连接成功,接收到服务器返回的消息后,获取匹配消息的超时时间。lrs_receive接收到数据后,会和预期的数据长度进行比较,如果长度不匹配,它将重新从套接字上读取数据,直到超时为止。 阅读全文

LoadRunner中的异常处理

2012-04-26 15:51 by 田志良, 1297 阅读, 收藏, 编辑
摘要:VuGen提供了错误处理函数lr_continue_on_error,用来在脚本中实时修改Vuser的出错设置。 阅读全文

loadrunner中的关联与参数化

2012-04-26 11:51 by 田志良, 2201 阅读, 收藏, 编辑
摘要:关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联。 阅读全文

loadrunner socket 函数介绍

2012-03-20 14:48 by 田志良, 7352 阅读, 收藏, 编辑
摘要:录制会话之后,通过 VuGen 的内置编辑器可以查看录制的代码。您可以在脚本中滚动,查看应用程序生成的函数,并检查传输的数 据。在主窗口中查看脚本时,可以看到VuGen 录制活动的顺序。在典型的会话期间,将录制下列函数顺序: lrs_startup 初始化 WinSock DLL lrs_create_socket 初始化套接字 lrs_send 在数据报上或者向流套接字发送数据 lrs_receive 接收来自数据报或流套接字的数据 lrs_disable_socket 禁用套接字操作 lrs_close_socket 关闭打开的套接字 lrs_cleanup 终止 WinSock DLL 的使用 VuGen 在 Windows 上使用 Windows 套接字协议支持应用程序的录制和重播;而在UNIX 平台上仅支持重播 阅读全文

性能测试工具LoadRunner中进程运行和线程运行区别

2012-01-04 15:19 by 田志良, 1338 阅读, 收藏, 编辑
摘要:如果选择按照线程方式运行,在默认情况下,controller为每50个用户仅启动一个mmdrv进程,而每个用户都按线程方式来运行,这些线程用户将共享父进程的内存段,这就节省了大量内存空间,从而可以在一个负载生成器上运行更多的用户。 阅读全文

LoadRunner参数化

2012-01-04 15:18 by 田志良, 1226 阅读, 收藏, 编辑
摘要:Sequential:顺序地向Vuser分配数据。 Random:当测试开始运行时,“随机”方法为每个Vuser分配一个数据表中的随机值。 Unique:为每一个Vuser的参数分配一个唯一的顺序值。在这种情况下必须确保表中的数据对所有的Vuser 阅读全文

Windows Phone 7入门

2011-09-30 11:32 by 田志良, 2228 阅读, 收藏, 编辑
摘要:Windows Phone 7开发注意事项: 1. 程序不能运行在后台、不支持多任务。 2. 目前C#是唯一支持的开发语言。 3. Native Code 不能作为应用程序的一部分来运行。 4. 同步时使用Zune连接到电脑。 5. 程序XAP包最大允许400MB。 6. 手机硬件的RAM是WP7最小内存需求256M时,程序的内存占用不能超过90MB。手机RAM是512MB时,程序的内存占用不能超过90+256=346MB。 阅读全文

C#设计模式(外观模式)

2011-09-30 11:06 by 田志良, 3647 阅读, 收藏, 编辑
摘要:如果要观看电影,必须在客户端执行下面的操作:先打开投影仪,再打开功放机,再打开屏幕,再打开 DVD 播放机,再打开灯光,在经历了这么多操作后,才可以看一场电影。而在关闭电影的时候,也要先关闭投影仪,再关闭功放机,再关闭屏幕,再关闭 DVD 播放机,再关闭灯光。哦,这是太复杂了!!!在客户端居然有那么多操作,如果有一些用户不知道如何使用其中的一个工具,那他便看不了电影! 阅读全文

C#设计模式(适配器模式)

2011-09-29 16:50 by 田志良, 3582 阅读, 收藏, 编辑
摘要:众所周知,在中国通用的电压时 220V,而美国电压则是 110V,如果有经常在美国和中国之间跑的 IT 人,而其笔记本都是随身携带的,那么它的笔记本的电压问题如何解决呢?(因为在美国和中国电压不同,所以一般的电器会不通用的)而适配器在这个问题上体现得淋漓尽致。现在的笔记本都有一个电源适配器,而正是这个电源适配器来解决上面提到的适配器问题,比如,一款索尼笔记本,其输入电流为交流100V~240V,而输出则是统一的直流 19.5V,在电源适配器的一端输入交流电流,然后通过电源适配器把电源变成需要的电压,也就是适配器的作用是使得一个东西适合另外一个东西。 阅读全文

WCF 快速入门

2011-08-09 16:56 by 田志良, 6050 阅读, 收藏, 编辑
摘要:构建HelloWCF应用的第一步是创建服务契约。契约式是表示消息应用外形的主要方式。对于外形,是指服务暴露的操作,使用的消息schema和每个操作实现的消息交换模式(MEP)。总之,契约定义了我们消息应用生成和使用的东西。大多数契约是带有WCF API定义的属性标记的类型定义。 阅读全文

WCF 消息拓扑和消息编排

2011-07-28 16:54 by 田志良, 932 阅读, 收藏, 编辑
摘要:消息拓扑描述的是在一个或多个发送者和接受者之间消息如何发送的。消息拓扑可以描述简单的应用-应用的连接关系,但是它同样可以描述复杂的应用-企业的连接。概括地说,这些可能存在的拓扑结构比面向组件的应用系统能够涉及到的情况会更加多、更加复杂。 阅读全文

WCF 消息交换模式

2011-07-28 10:57 by 田志良, 1347 阅读, 收藏, 编辑
摘要:我们描述消息交换最常用的细节粒度就是消息交换模式(MEP)。根据W3C草案(http://www.w3.org/2002/ws/cg/2/07/meps.html),一个MEP是“一个描述在消息参与者之间交换的消息的模板。”一个MEP被限制在一个发送者和接收者之间的逻辑连接上,整个行业也已经接收了这个事实。因为MEPS是个有点抽象的概念,近距离看一些现实世界的例子对于我们弄清MEPs这个概念有帮助。让我们来看看下面我和朋友关于足球票通话的例子: 阅读全文

WCF 面向服务的意义

2011-07-26 16:50 by 田志良, 923 阅读, 收藏, 编辑
摘要:“为什么我们需要面向服务?”回答很简单:可伸缩性、维护性、互操作性和灵活性。过去,分布式组件技术像COM紧紧地把所有的组件绑定到一起。最低限度上,这些分布式技术必须分享公共类型系统,并且常常是一个运行时。有了这些依赖,升级和软件升级变得复杂、费时和费力的。面向服务的应用系统,恰恰相反,不需要相同类型的依赖,因此显示出更加适合企业精算需求的行为。 阅读全文

WCF 面向服务的SOAP消息

2011-07-26 16:21 by 田志良, 3849 阅读, 收藏, 编辑
摘要:显然地,面向服务系统开发首先应该是创建契约。为了例子简单,一个订单包含一个产品ID(product ID)、数量(quantity)和状态消息(status message)。有了这三个字段,一个订单可以使用下面的伪schema代码表示: 阅读全文

WCF 面向服务的4个原则

2011-07-26 15:07 by 田志良, 803 阅读, 收藏, 编辑
摘要:面向服务里,服务可以与每个其它的服务通过消息交互。换句话说,服务可以穿越边界发送消息给其它服务。服务可以发送和接收消息,并且能被发送和接受的消息形状定义了服务的边界。这些边界被良好地定义,清晰地表示,并且是唯一的服务功能访问点。更实际点,如果服务1要和服务2交互,服务1必须发送消息给服务2.相反,一个面向对象或者面向组件的世界里,要求服务1应该创建一个服务2的实例(或者一个服务2的代理)。这个例子里,这些服务间的边界变得模糊了,因为服务1为了所有的目的,被服务2所控制。 阅读全文

WCF 填写消息地址

2011-07-26 11:31 by 田志良, 654 阅读, 收藏, 编辑
摘要:现在我们已经看过了与消息交互的实体,详细剖析了消息结构,然后看了一下WCF提供了几个消息编码器,现在我们来看一下如何在详细发送的时候表示我们要发送的目的地。毕竟,除非能发送给接受者,否则消息等于是毫无用处。和邮政服务需要一个良好格式的地址结构一样,面向服务的消息同样也需要一个定义良好的地址结构。这节里,我们将会建立自己的地址结构(Scheme),看它可以不可以广泛适用于所有的消息应用系统,然后把它关联到那个和WCF消息一起使用的地址结构上。 阅读全文

WCF 消息编码

2011-07-25 17:06 by 田志良, 1872 阅读, 收藏, 编辑
摘要:随着时间的流逝,也许我们会条件反射式地认为XML(SOAP)是一个结构文本。毕竟,文本是人可读的,每个计算机系统也可以处理文本。基于文本的XML的普遍共性与我们的与其它系统交互的想法产生了共鸣。可以容易的解释的基于文本的XML本质上会体积变大。可以理解使用XML会带来性能损失。就像要花费点精力把信装到信封里一样,它需要一些处理时间与XML交互。某些情况下,基于文本的XML数据大小限制了它的应用,特别是当我们要通过网络发送一个XML消息的时候。 阅读全文

WCF SOAP消息剖析

2011-07-22 16:06 by 田志良, 3342 阅读, 收藏, 编辑
摘要:小时候,我们学习到邮票应该贴在信封的右上角,地址应该写在中间。如果我们愿意,可以增加一个回复地址在信封的左上角。所有被处理的信件必须遵守这个基本的结构。如果格式不对,或者地址不清晰,或者地址不合法,邮政服务会认为这个邮件无效,并且无法投递。如果我们幸运的话,邮件会被退回(如果写地址的话)。可以想象没写地址有多混乱。如果发送者可以允许乱放邮票或者地址,邮政服务需要查遍整个信封来确定邮票和地址。很可能,为了完成新加投递任务,每次可能要增加远多于2美分的邮资。实际上,邮局定义的信封结构,从发信人角度来看,会改进信件处理的效率和一致性而不需要牺牲可用性。 阅读全文

WCF消息参与者

2011-07-22 15:36 by 田志良, 633 阅读, 收藏, 编辑
摘要:在面向服务的应用中,消息是通信的基本单位。因此,面向服务的应用通常被称为消息应用系统。在某一时刻,每个面向服务的应用系统都会发送或者接受消息。这个能够帮助你理解面向服务的消息很像你在Email系统里收到的信件一样。在邮件系统里,一个信件是抽象的实体:它可以包涵任何类型的信息,可以以不同的形式和大小存在,可以关联任何东西。同样,一个面向服务的消息也是一个抽象实体:它几乎可以包涵任何数据,可以使用许多不同的方式编码,并且可以关联到虚拟东西,甚至是其它消息。邮件的一些属性已经被广泛接受。例如,一封信件可以被某个人发送,邮寄给某个人,并且可能被某个人投递(某一时刻更多的是“可能”)。同样,一个面向服务的消息可以被计算机发送,发送给另一个计算机,并且可能由另外的计算机来投递。考虑某些喜欢死扣理论的书呆子,我必须澄清,与面向服务消息交互的实体不一定必须是计算机。理论上说,它们可以是信鸽,拉布拉多猎犬或者是狮虎。无论如何,这些与面向服务消息交互的实体被称作消息的参与者,并且在这本书里,一个消息参与者可以是一个计算机上的进程。 阅读全文

C#实现动态生成Word

2011-07-07 10:14 by 田志良, 10317 阅读, 收藏, 编辑
摘要:本篇文章主要介绍一个控制台例子,实现动态生成Word文件。 阅读全文

怎样编写注册表reg文件

2011-07-06 17:03 by 田志良, 1942 阅读, 收藏, 编辑
摘要:1、开头第一行一定是:“REGEDIT4”或“Windows Registry Editor Version 5.00”,以区别操作系统; 2、注册表信息头尾用“[”与“]”包起来; 3、" "内就是字符串内容; 4、“DWORD”为“0”就是用“dword:00000000”表示,因为“DWORD”值是16进位,16进位的“0”就是“00000000”。 5、因为本例中只有一行注册表信息([HKEY_CURRENT_USER\Software\Mi...]),所以没有空行。而如果有两个以上的注册表信息,信息与信息之间就需要有空行隔开。 6、如果要删除某个注册表信息该怎么办?很简单,在注册表信息前面加上“-”(减)号 阅读全文