• 沒有找到結果。

中介伺服器設計與實作

veCalls;

+ )

5.

,再呼叫 llIoDeviceTypeFile)。

eCalls;

call_list->get_Item(i)->set_OutputDevice( callIoDeviceTypeFile, “FileName” );

}

ICallCollectionPtr call_list = mSkype->Acti for( int i = 1 ; i<= call_list->Count ; i+

call_list->get_Item(i)->Finish();

將通話中其他使用者的聲音錄製到檔案中:

先取得所有正在進行的通話(ActiveCalls),比對之前記錄的 CallId set_OutputDevice()將 output 導至檔案中(ca

ICallCollectionPtr call_list = mSkype->Activ for( int i=1 ; i <= call_list->Count ; i++ ){

if( call_list->get_Item(i)->get_Id() == mCurrentCallId )

會議室 1

會議室 2

會議室 3

會議室 4

尚未加入會議室 的使用者 中介伺服器

圖 4-4 中介伺服器處理示意圖

由上圖可以看出一個中介伺服器處理的概念,連線至中介伺服器的使用者,

一開始是屬於「尚未加入會議室的使用者」。而會議室就像個小容器一樣,可以 容納想要加入的使用者。一個使用者同一時間只允許加入一間會議室,而一間會 議室可以容納多個使用者。

圖 4-5 中介伺服器的 UML Class Diagram

本研究開發中介伺服器的環境是 Ubuntu Server 6.10 (Linux) [16]。

編繹器是 G++(GCC) 4.1.2 [17]。

由上圖可知,本研究將中介伺服器的功能,利用物件導向的概念,劃分為四 個 Class 去實作處理:(1)CUser (2)CUserList (3)CMeetRoom (4)CMeetRoomList,

前兩個是專門處理使用者相關的,後兩個是專門處理會議相關的。

本研究實作出一個伺服器,建立一個 TCP 的 Socket。由於使用者與中介伺 服器溝通的訊息,一個都不能漏失掉,所以實作選用 TCP,而不用允許資料漏失 的 UDP。當伺服器啟動後,就開始 Listen,等待使用者連線進來,當有使用者連 線時,就 create 出一個 CUser 的物件專門負責此使用者的溝通。當有使用者要建

mSocket 記錄使用者的 Socket FD (File Description) 3. 記錄使用者的 Skype 帳號名稱:mName

4. 每一個使用者都各自配置一段 Receive Buffer(mBuffer),來接收傳來的 訊息。用 mBuffer_ptr 記錄目前 mBuffer 的訊息長度。

5. 收 到 封 包 時 呼 叫 Receive() 將 封 包 訊 息 寫 入 mBuffer 中 , 再 呼 叫 GetCommand()判斷是否有完整的指令可以處理。

6. 要傳送訊息給此使用者時,呼叫 SendCommand()即可。

‹ CUserList

1. 簡介:此為管理所有連線加入的使用者 (CUser)。

2. mUsers 記錄所有連線加入的使用者(CUser)。

3. 當伺服器偵測到有使用者加入時,即呼叫 AddUser();有使用者離開時,

即呼叫 RemoveUser()。

4. 當有新的使用者加入後,必須通知其他已連線的使用者,「有新的使用 者加入」的訊息,呼叫 SendToOther_AddUserList(),好讓這些使用者的 講解手立即更新顯示的使用者清單。

5. 其他類似功能包括:

有使用者離開:SendToOther_RemoveUserList() 有人建立會議室:SendToOther_AddRoomList() 有人關閉會議室:SendToOther_RemoveRoomList()

‹ CMeetRoom

1. 簡介:此為管理一間會議室的Class,處理所有加入的使用者,以及會 議進行中訊息的傳輸。

2. Class 記錄會議室中應有的訊息:

mHost:會議室的主席 mUsers:其他加入的使用者 mName:會議室主題名稱

mPassword:使用者加入會議室時,所需要輸入的密碼 mProjFile:會議進行主軸投影片檔

mIsStart:是否已開始進行會議

3. 當一名使用者建立會議室時,就建立一個 CMeetRoom 的物件,然後將 mHost 指定為此使用者。

4. 當主席建立此會議室後,就會上傳會 議室所需的投影片檔,呼叫 ReceiveProjFile() 將 檔 案 封 包 寫 入 mProjFile , 直 到 傳 送 完 成 後 , 將 mIsFileReady 設為 True。

5. 當主席將投影片檔案上傳完成後,即會呼叫 SendFileToOther(),傳送檔 案給其他已經加入的使用者們。

6. 當有其他使用者加入時,呼叫 JoinRoom()。

7. 當有其他使用者離開時,呼叫 LeaveRoom()。

8. 當有使用者想用廣播的方式告訴其他加入會議室的使用者時,即呼叫 SendCommandToOther()。

‹ CMeetRoomList

1. 簡介:管理所有已建立的會議室(CMeetRoom)。

2. 記錄所有已建立的會議室:mMeetRooms。

3. 有使用者建立一個新的會議室時,即呼叫 OpenRoom()。

4. 有主席建立的會議室結束時,即呼叫 CloseRoom()。

5. 有主席已建立會議室,但卻不正常的斷線時,即呼叫 DisconnectRoom()。

相關文件