开发一个基于DCOM的局域网聊天室(二)
TchatRoom的实现:
{ TChatRoom }
constructor TChatRoom.Create(RoomName:string;RoomID:integer);
begin
FBufferLength:=0;
FConnectCount:=0;
FClearBufferTag:=1;
FLocked:=false;
FRoomName:=RoomName;
FRoomID:=RoomID;
end;
procedure TChatRoom.ClearBuffer;
var
i:integer;
begin
///在这里可以检测一个标志,判断是否需要服务器记录每一次聊天内容
for i:=1 to 20 do
FBuffer[i]:=´´;
FBufferLength:=0;
FClearBufferTag:=0-FClearBufferTag;
end;
procedure TChatRoom.OneSpeak(content:string);
begin
FLocked:=true;
inc(FBufferLength);
if FBufferLength>20 then
begin
ClearBuffer;
inc(FBufferLength);
end;
FBuffer[FBufferLength]:=content;
FLocked:=false;
end;
function TChatRoom.OneRead:TStrings;
var
FStrings:TStrings;
i:integer;
begin
FLocked:=true;
FStrings:=TStringList.Create;
for i:=1 to FBufferLength do
FStrings.Add(FBuffer[i]);
result:=FStrings;
FLocked:=false;
end;
function TChatRoom.GetCanRead: boolean;
begin
result:=false;
if FBufferLength>0 then result:=true;
end;
procedure TChatRoom.LoginRoom(UserName:string);
//用户登陆聊天室事件,这里没有完全实现
begin
inc(FConnectCount);
end;
procedure TChatRoom.LeaveRoom(UserName: string);
//用户离开聊天室事件,这里没有完全实现
begin
Dec(FConnectCount);
end;
服务器端的最后一个比较重要的部分TchatRoomManager:
type
TChatRoomManager=class
private
ChatRoom:array of TChatRoom;
public
constructor Create;
function FindRoomByID(id:integer):TChatRoom;
end;
实现部分:
{ TChatRoomManager }
constructor TChatRoomManager.Create;
var
i,RoomCount:integer;
RoomNames:TStrings;//RoomName是配置文件中的聊天室名称
begin
RoomCount:=1;
//这里将从配置文件中读出有几个聊天室
RoomNames:=TStringList.Create;
RoomNames.Add(´TestRoom´);//这句将被最终的从配置文件读取替换掉
setlength(ChatRoom,RoomCount);
for i:=1 to RoomCount do
ChatRoom[i]:=TChatRoom.Create(RoomNames[i-1],i);
end;
function TChatRoomManager.FindRoomByID(id:integer): TChatRoom;
//该函数由IChatManager接口调用,由于最终版本的接口将会提供给客户
//端得到房间列表的功能,所以客户端知道自己房间的id
begin
result:=ChatRoom[id];
end;
initialization
ChatRoomManager:=TChatRoomManager.Create;
end.
在服务器端的主要核心部分完成以后,我们配置好服务器端的DCOM配置,就可以开发一个简单的客户端进行测试了:(虽然客户端尽可能的简单,我们不用配置DCOM但我们仍需要拷贝服务器端的类型库文件.tlb到客户端并注册后才能开发和使用客户端,当然,这些都可以通过安装程序来完成)
在客户端我们只列出两个相对重要的函数,其余的都省略,请想我来信获得全部的程序:
procedure TForm1.Button1Click(Sender: TObject);
//点击button1后将edit的内容“说”出去
begin
Server.SpeakTo(edit1.Text,1);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
//每隔一段时间向服务器请求谈话内容,我设置了为1.5秒
var
TempStrings:TStrings;
i:integer;
begin
if Server.ReadReady(1)=1 then
begin
TempStrings:=TStringList.Create;
SetOleStrings(TempStrings,Server.ReadFrom(1));
if FReadStartPos>19 then
if (FClearBufferTag=0-Server.TestClearBufferTag(1)) then
begin
FReadStartPos:=0;
FClearBufferTag:=Server.TestClearBufferTag(1);
end;
for i:=FReadStartPos to TempStrings.Count-1 do
Memo1.Lines.Add(TempStrings[i]);
FReadStartPos:=TempStrings.Count;
end;
end;
- · 在Delphi.net中调用COM/COM+
- · 资源文件的应用
- · delphi的面向对象之路1
- · 用Delphi模拟组件的两阶段提交
- · 术语VCL的变更:从VCL到CLX
- · delphi 7.0生成的AgentObjects_TLB.pas出错导至Ms Agent不能发声
- · 创建不规则形状的Control
- · 古都Delphi
- · Delphi点滴
- · 在Delphi中ADSI创建Windows用户帐号
- · ACCESS技巧集(DELPHI AND SQL)
- · Delphi断想
- · Delphi開發國際化應用程序
- · Office2000(2003) 下 outlook,word 的 com addin 之 delphi实现!(整理摸索)
- · 一个C++程序员的Delphi学习笔记
- · Delphi编程规范1.0.0.0
- · 在Delphi中使用指针参数
- · DELPHI中回调函数的使用
- · Delphi7的IDE概述(一)
- · Delphi7的IDE概述(二)
- · 动态设置系统日期格式
- · DELPHI中DBGrid中行的定位及着色实现
- · 开发一个基于DCOM的局域网聊天室(三)
- · 发送电子邮件
- · 增强MIDAS的安全性
- · 获得远程或本地机器的网卡的MAC
- · 区分保留字跟关键字
- · 通用查询组件设计(续)
- · 今天做了一个小软件,总结了一些经验与大家共享。
- · Delphi.NET 内部实现分析(1)
- · Delphi.NET 内部实现分析(2)
- · Delphi.NET 内部实现分析(4)
- · Delphi.NET 内部实现分析(5)
- · Delphi.NET 内部实现分析(3.1)
- · Delphi.NET 内部实现分析(3.2)
- · Delphi.NET 内部实现分析(3.3)
- · Delphi.NET 内部实现分析(3.4)
- · DELPHI8操作符重载的例子
