引發:

Error——Flash Player 無法連接到指定的遠程共享對象。確認 NetConnection 實例有效並已連接,且已在服務器上成功創建遠程共享對象。

4. send () 方法

public function send(... arguments):void

語言版本: ActionScript 3.0。

運行時版本: AIR 1.0、Flash Player 9、Flash Lite 4。

向連接到遠程共享對象的所有客戶端廣播一條消息(包括發送該消息的客戶端)。要處理並響應該消息,請創建一個附加到共享對象的回調函數。

參數:

...arguments——一個或多個參數:標識消息的字符串、附加到共享對象的一個或多個處理函數的名稱以及任意類型可選參數。處理函數的名稱隻能為單級形式(即不能是父/子級形式)並相對於共享對象。這些參數已進行序列化處理並通過連接進行發送,而接收處理函數按相同的順序接收它們。如果某個參數為循環對象(如循環的鏈接列表),則序列化函數可以正確處理引用。

函數名稱切勿使用保留術語。例如,myRemoteSO.send("close") 將失敗。

4.5 獲取用戶列表

多個客戶端之間通過RTMP協議進行通信,首要功能就是知道當前有哪些用戶在線,並且可以從服務器端同步和更新用戶在線情況。要完成這個功能,我們可以使用SharedObject來實現。具體流程如圖4-9所示。

圖4-9

當客戶端Flash裏的連接訪問Red5服務裏的應用時,應用會在第一次訪問時創建一個服務器端SharedObject,並且將當前的用戶列表保存到SharedObject裏。客戶端Flash裏的連接創建成功後,會繼續創建一個客戶端的SharedObject,該SharedObject會通過已經創建的連接和服務器端的SharedObject建立關聯。客戶端的SharedObject有一個監聽句柄OnSync,當服務器端的用戶列表發生變動時,我們可以將其同步到服務器端的SharedObject,這個行為就會觸發客戶端SharedObject的OnSync事件,將變動通告到客戶端。

4.5.1 服務器端

現在我們開始修改Red5應用的代碼,使之能夠實現剛才討論的目標。為了更好地體現差異,我們在之前的Red5FirstApp的代碼基礎上進行修改。

在類Application裏,先添加如下一些引用:

import org.red5.server.api.IScope;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

然後添加一個私有成員:

private Map clientDic = new HashMap();

clientDic將用來保存連接上來的用戶信息,其中Key是連接的用戶名,Value是對應的IConnection對象。

在類Application裏,再添加兩個方法的重載:

/** {@inheritDoc} */

@Override

public boolean connect(IConnection conn, IScope scope, Object[] params) {

return super.connect(conn, scope, params);

}