Todo
ll_paul:既然说到这份上,我就多说几句(这贴子如果100分就收场了,我觉得也不值)。
我近期实施了一个项目,服务器端用的是COM+(Windows 2000 Advanced Server主备,本来
想做成负荷分担,但由于Oracle 9i的原因没有搞成),出于效率、扩展性等方面的考虑,
没有用DCOM形态(EXE程序)的应用服务器,客户端用TDCOMConnection连接服务器。
使用TDCOMConnection连接服务器确实比较麻烦,主要麻烦在配置用户权限上面(对于这个问
题最简单的解决方法就是服务器与客户端建立相同的用户名和密码,客户端用此用户名和密码
登录),从安全性的角度来考虑,这样做的安全性是比较高的,非法的用户即使登录到网络,
也不能随意调用组件。Windows的权限机制还给TDCOMConnection的应用带来了另一个麻烦:
当我要把一个我的接口客户端程序放在另一台主上时就有麻烦了:该服务器是另一个网络上
的,是一个主域控制器,我这边的服务器也是主域控制器,这样设相同用户名和密码这一招
就不灵了,听说可以建立域信任关系来解决权限问题,我现在还没来得及试。使用TDCOMConnection
的另一个缺点其实也是一把双刃剑,它在阻止你不能透过代理服务器/防火墙来使用它时,同时
也提供给你了更高的安全性,这在系统需要在Internet中使用时尤为重要。
TSocketConnection用起来是很方便,它避开了恼人的Windows权限验证机制,并且可以在
Internet上透过代理服务器/防火墙使用。但是它的两个缺点使它实际上并不适合在Internet
上使用:第一,它使用Socket来连接服务器,从源代码上分析,scksrvr.exe(支持
TSocketConnection应用的服务器端)使用的就是TServerSocket。在Internet上使用时,网
络中断是家常便饭,客户端意外掉线时服务器端并不知道,还是继续打开着连接句柄,当先
前掉线的客户端再次连上来时,服务器又为它重新分配一个新的句柄,建立一个新的连接——
这样一来,很快服务器端就没有更多可以分配的Socket句柄了,这个资源一耗尽,它将不能
再为其它的客端提供服务。第二,由于没有了Windows的权限验证机制,任何知道服务器地
址和端口号(不知道端口号都关系不大)的客户端都能尝试着连上来,这包括了很多怀有恶
意的客户端,scksrvr对于这些恶意的客户端只能是待宰的羔羊。即使是在局域网中应用,
我们也经常听到听到有关对scksrvr稳定性的抱怨,由于我没有认真使用过TSocketConnection,
在这方面不能随便作出评价。
我的系统使用的是TDCOMConnection,那么怎样面对大量的客户端呢,如果每台客户端都要
为其设置一个密码,那岂不是麻烦,如果客户端改了密码,那岂不更麻烦?
对于这个问题,只能从业务上来管理一下:哪些用户需要高级、直观、交互性强的界面,
哪此用户只需要一个比较简单的输入、浏览界面……对于前者,我就提供给它Windows客户
端程序,我相信在一个大企业中,这部分用户只是少数的(至少对于我们的用户群是这样的);
对于后者,我提供给他们浏览器界面,B/S结构的程序就是好处。提供浏览器界面需要我做
相应的ASP程序来支持,“把整套程序改为ASP系统,工作量岂不是很大?!”,有人可能会
这样问,但情况并不是这样的,由于我把业务逻辑都写在组件里了,用户界面实际上只是一
个外壳,我可以用Dreamweaver来生成ASP的用户界面,再加入部分ASP代码(只用于调用组件
并根据调用结果提示一下用户)就行了,这样算下来改动量其实并不很大。想想看,如果在
规划系统时都把业务逻辑写到了客户端的话,要想把它改成B/S结构岂不歇菜?