国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

開發(fā)一個基于DCOM的局域網(wǎng)聊天室(二)

2019-11-18 18:26:14
字體:
供稿:網(wǎng)友
 

TchatRoom的實現(xiàn):

{ 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

 ///在這里可以檢測一個標(biāo)志,判斷是否需要服務(wù)器記錄每一次聊天內(nèi)容

 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);

//用戶登陸聊天室事件,這里沒有完全實現(xiàn)

begin

 inc(FConnectCount);

end;

 

procedure TChatRoom.LeaveRoom(UserName: string);

//用戶離開聊天室事件,這里沒有完全實現(xiàn)

begin

 Dec(FConnectCount);

end;

服務(wù)器端的最后一個比較重要的部分TchatRoomManager

type

 TChatRoomManager=class

 private

  ChatRoom:array of TChatRoom;

 public

  constructor Create;

  function FindRoomByID(id:integer):TChatRoom;

 end;

實現(xiàn)部分:

{ 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;

//該函數(shù)由IChatManager接口調(diào)用,由于最終版本的接口將會提供給客戶

//端得到房間列表的功能,所以客戶端知道自己房間的id

begin

 result:=ChatRoom[id];

end;

 

initialization

 ChatRoomManager:=TChatRoomManager.Create;

end.

在服務(wù)器端的主要核心部分完成以后,我們配置好服務(wù)器端的DCOM配置,就可以開發(fā)一個簡單的客戶端進(jìn)行測試了:(雖然客戶端盡可能的簡單,我們不用配置DCOM但我們?nèi)孕枰截惙?wù)器端的類型庫文件.tlb到客戶端并注冊后才能開發(fā)和使用客戶端,當(dāng)然,這些都可以通過安裝程序來完成)

在客戶端我們只列出兩個相對重要的函數(shù),其余的都省略,請想我來信獲得全部的程序:

procedure TForm1.Button1Click(Sender: TObject);

//點擊button1后將edit的內(nèi)容“說”出去

begin

 Server.SpeakTo(edit1.Text,1);

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

//每隔一段時間向服務(wù)器請求談話內(nèi)容,我設(shè)置了為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;

一個基于DCOM的局域網(wǎng)聊天室的核心部分就基本完成了,并且所有的測試都比較順利,這里需要補充說明一下聊天室服務(wù)器的一個難點:就是需要開發(fā)者非常謹(jǐn)慎的處理同步,雖然我也進(jìn)行了一定的同步處理,但在客戶端人數(shù)眾多的情況下仍然可能發(fā)生死鎖或其它活鎖的情況,這個程序還需要更進(jìn)一步的測試、甚至進(jìn)行一定的重構(gòu)。盡請關(guān)注后文。


上一篇:實現(xiàn)QQ窗體的縮入伸出功能

下一篇:開發(fā)一個基于DCOM的局域網(wǎng)聊天室(一)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 望都县| 鹤峰县| 军事| 镇宁| 杭锦后旗| 阳东县| 安顺市| 西充县| 黑水县| 周至县| 霍林郭勒市| 镇康县| 瑞丽市| 通州市| 织金县| 翁源县| 江阴市| 安远县| 红桥区| 大安市| 武乡县| 吴忠市| 公安县| 景德镇市| 始兴县| 碌曲县| 郸城县| 黄梅县| 阿鲁科尔沁旗| 来宾市| 区。| 进贤县| 凌源市| 德钦县| 南昌市| 沛县| 军事| 德安县| 竹山县| 阜宁县| 普定县|