熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

開發基於DCOM的局域網聊天室(一)

2022-06-13   來源: Delphi編程 


  先行知識Delphi / 接口 / OLE&COM&DCOM / Win
  
  首先祝大家新春快樂猴年萬事如意!
  
  在前面的幾篇文章中我們已經探討了不少基於微軟COM的相關技術而分布式COM(以下簡稱DCOM)的出現給我們輕松的創建分布式應用提供了機會我們可以完全不去理會低級別的Windows Sockets(DCOM通過MSRPC讓客戶與對象進行通信幸運的是要開發COM應用開發者幾乎可以不去理會MSRPC)而開發出功能強大偶合性低(功能模塊相對獨立很好的發揮了OO的思想)易於部署的分布式計算系統
  
  在這次的文章中我們就打算使用DCOM來開發一個局域網聊天室不僅是作為技術上的研究實際上我相信這應該也是一個有用的工具首先我們要對這個聊天室的功能有一個大致的了解至少這個聊天室應該允許多個局域網用戶進行聊天(有點廢話應該能夠有多個話題的子聊天室用戶可以選擇進入某個聊天室進行聊天客戶端應該盡量簡單(不用配置DCOM)並需要一個服務器端管理所有的交互行為管理聊天室的數目和相關配置並做好系統監測和日志記錄等對聊天室功能進行擴展(如悄悄話功能表情符號等)根據以上的功能描述在仔細分析問題以後我們設計出下面的草圖
  
  這篇文章中我們要大致實現這個程序的一個基本的核心包括IChatManagerTChatRoomManagerTchatRoom完成一個最基本功能的服務器端並做一個簡單的客戶端進行檢測我們的重點是服務器端因為它將實現聊天室的大部分功能客戶端只是一個十分小巧簡單的程序
  
  由於篇幅關系我們只列出重要的部分的代碼完整的程序請給我發email首先來看看我們的IchatManager接口是什麼樣子(由於這裡我們只實現了最基本的功能這個接口並不完整我們將在以後的文章中給出完整的聲明)
  
   IChatManager = interface(IDispatch)
  
   [&#;{ECDFDFACBDEBF}&#;]
  
   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;
  
   //客戶登陸指定房間

procedure DisconnectRoom(const UserName: WideString; RoomID: Integer); safecall;
  
   //客戶退出指定房間
  
   function TestClearBufferTag(RoomID: Integer): Integer; safecall;
  
   //客戶測試指定房間的緩沖區的清空與否狀況
  
   end;
  
  再來看看接口的實現類TChatManager部分
  
  type
  
   TChatManager = class(TAutoObject IChatManager)
  
   protected
  
   function ReadFrom(sourceid: Integer): IStrings; safecall;
  
   //在這裡我們使用Delphi擴展的復雜類型TStings為了讓COM支持這種
  
   //類型delphi提供了IStrings接口
  
   procedure SpeakTo(const content: WideString; destid: Integer); safecall;
  
   function ReadReady(id: Integer): Byte; safecall;
  
   //用來提供給客戶端查詢指定的房間是否可讀既指定房間緩沖區是否為空
  
   procedure ConnectRoom(const UserName: WideString; RoomID: Integer);
  
   safecall;
  
   procedure DisconnectRoom(const UserName: WideString; RoomID: Integer);
  
   safecall;
  
   function TestClearBufferTag(RoomID: Integer): Integer; safecall;
  
   end;
  
  實現部分
  
  function TChatManagerReadFrom(sourceid: Integer): IStrings;
  
  var
  
 TempRoom:TChatRoom;
  
  begin
  
   TempRoom:=ChatRoomManagerFindRoomByID(sourceid);
  
   while TempRoomLocked do
  
   begin
  
   //do nothing只是等待解鎖
  
   end;
  
   GetOleStrings(TempRoomOneReadResult);
  
  end;
  
  procedure TChatManagerSpeakTo(const content: WideString; destid: Integer);
  
  var
  
   TempRoom:TChatRoom;
  
  begin
  
   TempRoom:=ChatRoomManagerFindRoomByID(destid);
  
   while    


From:http://tw.wingwit.com/Article/program/Delphi/201401/30268.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.