先行知识:delphi / 接口 / ole&com&dcom / win32
首先祝大家新春快乐,猴年万事如意!
在前面的几篇文章中我们已经探讨了不少基于微软com的相关技术,而分布式com(以下简称dcom)的出现给我们轻松的创建分布式应用提供了机会;我们可以完全不去理会低级别的windows sockets(dcom通过ms-rpc让客户与对象进行通信,幸运的是要开发com应用,开发者几乎可以不去理会ms-rpc)而开发出功能强大、偶合性低(功能模块相对独立,很好的发挥了oo的思想)、易于部署的分布式计算系统。
在这次的文章中,我们就打算使用dcom来开发一个局域网聊天室,不仅是作为技术上的研究,实际上我相信这应该也是一个有用的工具。首先我们要对这个聊天室的功能有一个大致的了解:1、至少这个聊天室应该允许多个局域网用户进行聊天。(有点废话。。。)2、应该能够有多个话题的子聊天室,用户可以选择进入某个聊天室进行聊天。3、客户端应该尽量简单(不用配置dcom),并需要一个服务器端管理所有的交互行为,管理聊天室的数目和相关配置,并做好系统监测和日志记录等。4、对聊天室功能进行扩展(如悄悄话功能,表情符号等)。根据以上的功能描述,在仔细分析问题以后我们设计出下面的草图:
这篇文章中我们要大致实现这个程序的一个基本的核心,包括ichatmanager、tchatroommanager、tchatroom,完成一个最基本功能的服务器端,并做一个简单的客户端进行检测。我们的重点是服务器端,因为它将实现聊天室的大部分功能,客户端只是一个十分小巧简单的程序。
由于篇幅关系,我们只列出重要的部分的代码,完整的程序请给我发email。首先来看看我们的ichatmanager接口是什么样子(由于这里我们只实现了最基本的功能,这个接口并不完整,我们将在以后的文章中给出完整的声明):
ichatmanager = interface(idispatch)
['{e7cd7f0d-447f-497a-8c7b-1d80e748b67f}']
procedure speakto(const content: widestring; destid: integer); safecall;
//客户向指定的房间说话,destid为房间号
function readfrom(sourceid: integer): istrings; safecall;
//客户从指定的房间读取谈话内容,sourceid为房间号
function readready(id: integer): byte; safecall;
//客户检测指定的房间是否已经可以读取谈话内容
procedure connectroom(const username: widestring; roomid: integer); safecall;
//客户登陆指定房间
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器