パッケージnet.user1.reactor
クラスpublic class Client
継承Client Inheritance flash.events.EventDispatcher
実装 IClient

バージョン : Reactor 1.0.0

ClientクラスはUnionサーバーに接続している個別のクライアントを表します。 各クライアントはクライアント属性に格納されている共有データを送受信することができます。

ClientオブジェクトがReactor API内でどのようにクライアントの接続を表すかを学ぶために、簡単なチャットアプリ、chat.swfが二つの別々のコンピューター"A"と"B"上で動作していると考えましょう。 コンピューターAのchat.swfが開始するとき、これは次のコードを使用してUnionサーバーへ接続します。

   var reactor:Reactor = new Reactor();
   reactor.connect("tryunion.com",  80);
   

コンピューターAのchat.swfのUnionサーバーへの接続が確立されると、UnionサーバーはコンピューターAのchat.swfによって開かれたソケットに対してサーバー側のクライアントオブジェクトを生成し、そのクライアントに("37"のような)ユニークなクライアントIDを割り当てます。 同様に、コンピューターBのchat.swfのUnionサーバーへの接続が確立したとき、Unionサーバーは二番目のクライアントオブジェクトを生成してユニークな(”38”のような)クライアントIDを割り当てます。 この段階では、この2クライアントがサーバーに接続されていますが、お互いのことはわかりません。

お互いを把握するために、その二つのクライアント--クライアントA(コンピューターAのchat.swf)とクライアントB(コンピューターBのchat.swf)--がルームに入室します。 こちらがそれぞれのchat.swfで実行される"ルーム入室"コードです。

   var room:Room = reactor.getRoomManager().createRoom("examples.chat");
   room.join();
   

ルーム"examples.chat"への入室において、各クライアントは自動的にそのルームの"入室者"(ルーム内にいるクライアント)のリストを送信されます。 コンピューターAのchat.swfが最初にルームに入室し、ルーム"examples.chat"の入室者リストを送信されると仮定しましょう。 クライアントAはルームに入室した最初のクライアントであるため、このリストにはクライアントAしか含まれません。 (もしそのルームに既に他の入室者がいた場合、それらもリストに含まれている状態になります。) クライアントAはそのルームの入室者リストを受信した後、RoomEvent.JOINイベントをトリガーします。 いったんイベントが発火すると、コンピューターAのchat.swfはRoomのgetOccupants()メソッドを使用する事で、次のようにルーム内のクライアントにアクセスできます:

   room.addEventListener(RoomEvent.JOIN, joinListener);
   
   protected function joinListener (e:RoomEvent):void {
     trace("Here are the room's occupants: " + Room(e.target).getOccupants());
   }
   

今はクライアントBが"examples.chat"ルームに入室すると仮定しましょう。 クライアントAはルームに入室済みであるため、clientBがルームに入室すると通知を受け取り、コンピューターAのchat.swf内のRoomオブジェクトはRoomEvent.ADD_OCCUPANTイベントをトリガーします。 そのイベントはRoomEvent.getClient()メソッドを通したクライアントBのClientオブジェクトへのアクセスをクライアントAに提供します。 次のコードで実例を示します。

   room.addEventListener(RoomEvent.ADD_OCCUPANT, addOccupantListener);
   
   protected function addOccupantListener (e:RoomEvent):void {
     // この例では、e.getClient()はクライアントBのClientオブジェクトへの参照です。
     trace("Someone joined the room: " + e.getClient());
   }
   

いったんクライアントAがクライアントBのClientオブジェクトへの参照を持つと、クライアントAはクライアントBの属性を読み込むことでそのデータにアクセスでき、クライアントBにメッセージを送ることでクライアントAから通信を行えます。 例えば、次のコード内では、chat.swfがclientB(およびその後ルームに入室する他のクライアント)にプライベートメッセージを送信します。 "PRIVATE_CHAT"はビルトインメッセージではない点に留意してください。これはchat.swfアプリケーションによって決定されたカスタムメッセージ名です。

   protected function addOccupantListener (e:RoomEvent):void {
     var newOccupant:Client = e.getClient();
     // クライアントBにプライベートメッセージを送信します。
     newOccupant.sendMessage("PRIVATE_CHAT", "Welcome to the chat room!");
   }
   

ルームへの入室に加えて、クライアントはClientManagerのwatchForClients()とobserveClient()メソッドを通してお互いを把握することができます。 watchForClients()メソッドを使用すると現クライアントはサーバー上の各クライアントを把握できます。 observeClient()メソッドは現クライアントに一つの指定クライアントを把握させます。 どんな時にでも、把握しているクライアントのClientオブジェクトはClientManagerのgetClient()メソッドを通して取得できます。

他のクライアント("自分以外のクライアント"という意味で)へのアクセスに加えて、各クライアントはReactorのself()メソッドを通してそれ自身を表現するClientオブジェクトへアクセスできます。 クライアント自身の接続を表すClientオブジェクトは現クライアントとして知られます。 次のコードは現クライアントのclientIDを表示します:

   // 現クライアントのクライアントIDを表示します。現クライアントはReactorが
   // ready状態のときのみ利用可能である点に留意してください。ReactorEvent.READYを参照してください。
   trace(reactor.self().getClientID());
   

クライアントはクライアント属性にデータを格納します。これは共有可能なマルチユーザー変数のようにふるまいます。 クライアント属性の値を取り出すには、ClientクラスのgetAttribute()メソッドを次のように使用してください:

   var theClient:Client = reactor.getClientManager().getClient(someClientID);
   theClient.getAttribute(someAttributeName, someRoomID);
   

このコードでは、someRoomIDが属性のスコープでsomeAttributeNameが属性名です。 クライアントの属性を設定するためにはsetAttribute()を使用します。 ただし、デフォルトでは、クライアントは自分自身の属性しか設定できない点に注意してください。接続中の他のクライアントの属性は設定できません。

次のコードは"chessGame"ルームをスコープとした、clientID 5のクライアントの属性"pieceColour"を取得します。

   var client:Client = getClientManager.getClient("5");
   var pieceColour:String = client.getAttribute("pieceColour", "chessGame");
   

同様に、次のコードはクライアント5のグローバル属性"age"を取得します。 属性のスコープが省略されている点に注目してください。これはその属性がグローバルであることを示しています。

   var client:Client = getClientManager.getClient("5");
   var name:String = client.getAttribute("age");
   

クライアントの属性の変更を取得するためにはポーリングは行いません。 クライアント属性が共有されているとき、その値の変更は自動的にRoomEvent.UPDATE_CLIENT_ATTRIBUTEイベントとAttributeEvent.UPDATEイベントをトリガーします。

サーバーとクライアント間の通信量を削減するために、デフォルトでは、サーバー上の全クライアントへClientインスタンスとしてアクセスすることはできません。 現クライアントはその"把握している範囲"内の他のクライアントへのみアクセスできます。これには同期済みのルーム、"観察されている"クライアント(ClientManagerのobserveClient()メソッドを参照してください)、そして"監視されている"クライアント(ClientManagerのwatchForClients()メソッドを参照してください)を含みます。

例えば、いまサーバー上にルームが3つあるとします。 さらに、各ルームが3つのクライアントを含むとします。 これがそのルーム名と各ルームに入室しているクライアントIDのリストです。

   chat1: 1, 2, 3
   chat2: 1, 4, 5
   chat3: 6, 7, 8
   

クライアント1は"chat1"と"chat2"両方のルームに入室しているため、そのClientオブジェクトのリストにはID1, 2, 3, 4, 5のクライアントが含まれます。 一方、クライアント1は"chat3"ルームには入っていないため、そのClientオブジェクトのリストにはID6, 7, 8のクライアントは含まれません。 ルームの同期についての詳細はRoomクラスを参照してください。

アプリケーションは次のメソッドを通してカスタムクライアントクラスを割り当てることによって、接続したクライアントに独自の挙動を加えることができます: ClientのsetClientClass()、RoomManagerのsetDefaultClientClass()とClientManagerのsetDefaultClientClass()です。

クライアントはユーザーアカウントを作成してログインすることで、後で取得できる永続データを保存することができます。 ユーザーアカウントはUnionにビルトインであり、Unionサーバーのインストールごとに使用準備が整います。 アカウントにログインするには、AccountManagerのlogin()メソッドを使用してください。 ログインしているクライアントのユーザーアカウントにアクセスするには、ClientクラスのgetAccount()メソッドを使用してください。 ユーザーアカウントの完全な情報については、UserAccountクラスを参照してください。

アプリケーションがサーバー上の任意のクライアントについての情報の一時的なスナップショットを取得したい場合で、かつその情報を自動的に最新に保つ必要がない場合、そのアプリケーションはClientSnapshotクラスを使用できます。

関連項目

ClientManager
RoomEvent.UPDATE_CLIENT_ATTRIBUTE
AccountEvent.UPDATE
AccountManager.login()
UserAccount
net.user1.reactor.snapshot.ClientSnapshot
Room


パブリック メソッド
 メソッド定義元
  
Client(clientID:String, clientManager:ClientManager, messageManager:MessageManager, roomManager:RoomManager, connectionManager:ConnectionManager, server:Server, log:Logger)
Clientインスタンスを初期化します。
Client
  
deleteAttribute(attrName:String, attrScope:String = null):void
指定したクライアント属性をサーバーから削除します。
Client
  
このクライアントのUserAccountオブジェクトへの参照を返します。これはこのクライアントがユーザーアカウントにログインしている場合にのみ利用可能です。
Client
  
getAttribute(attrName:String, attrScope:String = null):String
指定したクライアント属性の値を返します。
Client
  
getAttributes():Object
このクライアントが共有している属性の名称と値を変数として持つオブジェクトを返します。
Client
  
getAttributesByScope(scope:String = null):Object
与えられたスコープ、あるいは全てのスコープにおいてこのClientインスタンスに定義されている全ての属性名と値を含むオブジェクトを返します。
Client
  
getClientID():String
このクライアントの、サーバーによって自動的に設定されたユニークIDを返します。
Client
  
このClientオブジェクトを管理するClientManagerのインスタンスへの参照を返します。
Client
  
クライアントの現在のサーバーとの接続状態を表します。
Client
  
このクライアントが接続したときにサーバーによって設定された時間を返します。
Client
  
getIP():String
もし利用可能であれば、このクライアントのIPアドレスを返します。
Client
  
このクライアントが観戦していると把握されているルームのIDを返します。
Client
  
このクライアントが入室していると把握されているルームのIDを返します。
Client
  
getPing():int
クライアントのping時間をミリ秒で返します。
Client
  
getTimeOnline():Number
指定クライアントのサーバへの接続時間をミリ秒で返します。
Client
  
isInRoom(roomID:String):Boolean
このクライアントが指定のルームに入室していることが把握されているかどうかを示す論理値を返します。
Client
  
isObservingRoom(roomID:String):Boolean
このクライアントが指定のルームを観戦していることが把握されているかどうかを示す論理値を返します。
Client
  
isSelf():Boolean
このクライアントが現クライアントであればtrueを返します。
Client
  
kick():void
このクライアントをサーバーから切断します。
Client
  
observe():void
このクライアントの状態が常に同期を維持するようにサーバーに要求します。
Client
  
sendMessage(messageName:String, ... arguments):void
引数を備えたメッセージを他のクライアントに送信します。
Client
  
setAttribute(attrName:String, attrValue:String, attrScope:String = null, isShared:Boolean = true, isUnique:Boolean = false, evaluate:Boolean = false):void
このクライアントにクライアント属性を設定します。
Client
  
setClientClass(scope:String, clientClass:Class, ... fallbackClasses):void
特定のスコープのルームにいる現クライアントのクラスを指定します。
Client
  
このクライアントの観察を停止するようにサーバーに要求します。
Client
  
toString():String
[オーバーライド] このオブジェクトのString表現を提供します。
Client
Events
 Event Summary 定義元
   属性が削除されるときに送出されます。Client
   属性の削除試行の結果を受信したときに送出されます。Client
   このイベントをトリガーしたクライアントがルームに入室するときに送出されます。Client
   このイベントをトリガーしたクライアントがルームから退室するときに送出されます。Client
   現クライアントによって把握されているクライアントのいずれかがログインするときに送出されます。Client
   現クライアントによって把握されているユーザーアカウントのいずれかがログオフするときに送出されます。Client
   現クライアントがクライアントを観察するときに送出されます。Client
   先に行われたClient.observe()かClientManager.observeClient()要求の結果を受信したときに送出されます。Client
   このイベントをトリガーしたクライアントがルームの観戦を開始するときに送出されます。Client
   属性のセット試行の結果を受信したときに送出されます。Client
   現クライアントがクライアントの観察を停止するときに送出されます。Client
   先に行われたClient.stopObserving()かClientManager.stopObservingClient()要求の結果を受信したときに送出されます。Client
   このイベントをトリガーしたクライアントがルームの観戦を停止するときに送出されます。Client
   このイベントをトリガーしたクライアントが先に行ったobserve()要求によってサーバー状態と一致するように同期したときに送出されます。Client
   属性が変化するか最初にセットされるときに送出されます。Client
コンストラクタの詳細
Client()コンストラクタ
public function Client(clientID:String, clientManager:ClientManager, messageManager:MessageManager, roomManager:RoomManager, connectionManager:ConnectionManager, server:Server, log:Logger)

Clientインスタンスを初期化します。 ClientインスタンスはClientManagerによって自動的に生成される点に注意してください。 Clientインスタンスを手動で生成してはいけません。

パラメータ
clientID:String
 
clientManager:ClientManager
 
messageManager:MessageManager
 
roomManager:RoomManager
 
connectionManager:ConnectionManager
 
server:Server
 
log:Logger
メソッドの詳細
deleteAttribute()メソッド
public function deleteAttribute(attrName:String, attrScope:String = null):void

バージョン : Reactor 1.0.0

指定したクライアント属性をサーバーから削除します。 他のクライアントはRoomEvent.DELETE_CLIENT_ATTRIBUTEとAtributeEvent.DELETEイベントを通して更新を通知されます。

パラメータ

attrName:String — 削除する属性名です。 パイプ文字("|")を含めてはいけません。
 
attrScope:String (default = null) — 属性のスコープを示す完全修飾ルームIDです。 グローバルなクライアント属性(つまり全てのルームをスコープとする属性)を除去するためにはnullを使用します。 Roomオブジェクトの完全修飾ルームIDを取り出すには、Room.getRoomID()を使用してください。 デフォルトはnull(グローバル属性)です。

関連項目

getAccount()メソッド 
public function getAccount():UserAccount

バージョン : Reactor 1.0.0

このクライアントのUserAccountオブジェクトへの参照を返します。これはこのクライアントがユーザーアカウントにログインしている場合にのみ利用可能です。

戻り値
UserAccount

関連項目

getAttribute()メソッド 
public function getAttribute(attrName:String, attrScope:String = null):String

バージョン : Reactor 1.0.0

指定したクライアント属性の値を返します。 クライアント属性はClientクラスのsetAttribute()メソッドを通して、あるいはサーバーから直接指定されます。 クライアント属性についての完全な詳細はsetAttribute()を参照してください。

パラメータ

attrName:String — その属性がスコープとしているルームの完全修飾ルームIDです。 たとえば、"examples.chat"です。 nullの場合は、その属性はグローバルスコープとして読み出せます。
 
attrScope:String (default = null) — 取り出す属性名です。

戻り値
StringattrNameで指定した属性のストリング値を返します。

関連項目

getAttributes()メソッド 
public function getAttributes():Object

バージョン : Reactor 1.0.0

このクライアントが共有している属性の名称と値を変数として持つオブジェクトを返します。 各変数名は完全修飾の属性名です。 例えばあるクライアントにおいて、ルームをスコープとする属性"examples.chatroom1.username"を"dan"に、グローバル属性"gender"を"male"に設定したとすると、getAttributes()メソッドは次のような構造のオブジェクトを返します。

     var o:Object();
     o["examples.chatroom1.username"] = "dan";
     o["gender"] = "male";
     
比較として、getAttributesByScope()は次の構造のオブジェクトを返します:
     var o:Object();
     o["examples.chatroom1"] = new Object();
     o["examples.chatroom1"].username = "dan";
     o[Tokens.GLOBAL_ATTR] = new Object();
     o[Tokens.GLOBAL_ATTR]["gender"] = "male";
     
getAttributes()メソッドは属性の名称と値のフラットなリストを横断するときに使われます。 The getAttributesByScope()メソッドは属性のスコープ、名称と値の階層的なリストを横断するときに使われます。 両方のケースにおいて、オブジェクトは現在の属性のコピーを返します。 getAttributes()あるいはgetAttributesByScope()を呼び出した後の属性の変化はオブジェクトには反映されません。

戻り値
Object

関連項目



getAttributes()によって返されたオブジェクトの変数を読み取るためには、for-inループを使用します。 例えば、次のコードはデバッグコンソールにクライアントの属性を書き出します。
var clientAttrs:Object = client.getAttributes();
     for (var attrName in clientAttrs) {
       trace("Attribute: " + attrName + " has the value: " + clientAttrs[attrVal]);
     }
getAttributesByScope()メソッド 
public function getAttributesByScope(scope:String = null):Object

バージョン : Reactor 1.0.0

与えられたスコープ、あるいは全てのスコープにおいてこのClientインスタンスに定義されている全ての属性名と値を含むオブジェクトを返します。

スコープが指定されているとき、戻り値のオブジェクトは次の構造を持ちます:

     {name1:value1, name2:value2,...namen:valuen}
     
スコープを指定しないとき、戻り値のオブジェクトは次の構造を持ちます:
     {scope1: {name1:value1, name2:value2,...namen:valuen},
      scope2: {name1:value1, name2:value2,...namen:valuen},
      scopen: {name1:value1, name2:value2,...namen:valuen}}
     
例えば、あるクライアントが次のような二つの属性を持つとします。 このクライアントのgetAttributesByScope()が返す属性オブジェクトは次のような構造になります。
var o:Object = new Object();
     o[Tokens.GLOBAL_ATTR]["username"] = "derek";
     o["games.pong"]["score"] = 8;
getAttributes()と比較すると、こちらは次のような構造のオブジェクトを返します。
var o:Object = new Object();
     o["username"] = "derek";
     o["games.pong.score"] = 8;

パラメータ

scope:String (default = null)

戻り値
Object — 与えられたスコープ、あるいは全スコープにおけるこのClientの属性を含むジェネリックなオブジェクトです。

関連項目



次のコードはfor-inループを使用して指定したスコープを持つ全ての属性を表示します。
// クライアントのIDです。この例では、3を使用します。
     var clientID = 3;
     
     // 全スコープにおける属性を表すオブジェクトを取得します。
     var attributesObj = reactor.getClientManager().getClient(
                                                clientID).getAttributesByScope();
     
     // グローバルスコープ内の全属性を列挙します。
     for (var attrname:String in attributesObj[Tokens.GLOBAL_ATTR]) {
       trace("Global attribute name: " + attrname
            + " has the value: " + attributesObj[Tokens.GLOBAL_ATTR][attrname]);
     }
次のコードはネストされたfor-inループを使用して全てのスコープを持つ属性を表示します。
     for (var scope:String in attributesObj) {
       for (var attrname in attributesObj[scope]) {
         trace("Attribute in scope: " + scope
              + " with the name: " + attrname
              + " has the value: " + attributesObj[scope][attrname]);
       }
     }
getClientID()メソッド 
public function getClientID():String

バージョン : Reactor 1.0.0

このクライアントの、サーバーによって自動的に設定されたユニークIDを返します。 クライアントIDはクライアントが接続している限り維持され、接続中に変更することはできません。 クライアントIDはクライアントが切断されたときに失効します。

クライアントIDについて保証されるのは次の二点だけであることに注意してください。1)ストリング型である。2)サーバー上でユニークである。 クライアントIDの指定形式については任意に決められるので保障されず、信頼するべきでもありません。 例えば、IDが数値だったとしても("35"など)、その数値に基づいた数値計算を行うべきではありません。 IDの形式自体が、通知無しに変更されることもあります。 クライアントサイドで内部的なクライアントID自体を信用したコードを書くことは、単にIDがユニークで与えられるという事実のみを用いるより危険です。 クライアントの真の並び順については、ClientクラスのgetConnectTime()を使用してください。このメソッドは与えられたクライアントが接続したときのサーバー時間を返します。

現クライアント(つまり、reactor.self())のクライアントIDはReactorEvent.READYイベントが発生した後にのみ利用可能です。

クライアントIDを持つことに加え、クライアントはuserIDをもつユーザーアカウントにもログインすることがある点に留意してください。 クライアントIDは一時的で一度の接続につき自動的に生成されるIDなのに対して、ユーザーIDは永続的なサーバー側のユーザーアカウントの名前であり、クライアントがログインした後にのみ有効です。 UserAccountクラスとClientクラスのgetAccount()メソッドを参照してください。

戻り値
String — このクライアントのクライアントIDです。

関連項目

getClientManager()メソッド 
public function getClientManager():ClientManager

バージョン : Reactor 1.0.0

このClientオブジェクトを管理するClientManagerのインスタンスへの参照を返します。

戻り値
ClientManager

関連項目

getConnectionState()メソッド 
public function getConnectionState():int

バージョン : Reactor 1.0.0

クライアントの現在のサーバーとの接続状態を表します。 この値はConnectionStateクラスの定数のうちの一つになります。

戻り値
int

関連項目

getConnectTime()メソッド 
public function getConnectTime():Number

バージョン : Reactor 1.0.0

このクライアントが接続したときにサーバーによって設定された時間を返します。 この時間は1970年を基点としたミリ秒で表され、サーバーのクロックに基づいてUTCで与えられます。 getConnectTime()の戻り値をActionScriptのDateオブジェクトに変換するには、次のように値をDateコンストラクタに渡します。

// theClientが接続開始した時間を表すDateオブジェクトを作成します。
     var d:Date = new Date(theClient.getConnectTime());
     
接続時間は"_CT"というグローバルなクライアント属性にも格納されていますので、このメソッドは次のコードと同義となります。
theClient.getAttribute("_CT");
. サーバーの現在の時間はServerのgetServerTime()メソッドを通して読み出せます。 クライアントの総接続時間を読み出すには、ClientクラスのgetTimeOnline()メソッドを使用します。

戻り値
Number — このクライアントがサーバーに接続したときの時間です。サーバーのクロックに基づき、1970年を基点としたミリ秒で表されます。

関連項目

getIP()メソッド 
public function getIP():String

バージョン : Reactor 1.0.0

もし利用可能であれば、このクライアントのIPアドレスを返します。 IPアドレスは"_IP"というグローバルなクライアント属性に格納されている点を覚えておいてください。そのためこのメソッドはtheClient.getAttribute("_IP");と同義となります。 デフォルトでは、クライアントは自身のIPアドレスしか把握せず、サーバー上の他のクライアントのIPアドレスへのアクセス権はありません。

戻り値
String — このクライアントにおけるストリング型のIPアドレスです。
getObservedRoomIDs()メソッド 
public function getObservedRoomIDs():Array

バージョン : Reactor 1.0.0

このクライアントが観戦していると把握されているルームのIDを返します。 ここで返されるルームリストはサーバー全体のうち現クライアントが把握しているルームの分だけであり、実際のサーバーの状態を完全には反映しません。 このメソッドはそのクライアントが観戦していたルームのIDを返します。これにはそのクライアントが入室していたルームのIDは含まれません。

ルームIDのリストは一時的なスナップショットであり、現クライアントがルームの観戦を開始または停止するときに更新されません。

戻り値
Array — ルームIDの配列です。

関連項目

getOccupiedRoomIDs()メソッド 
public function getOccupiedRoomIDs():Array

バージョン : Reactor 1.0.0

このクライアントが入室していると把握されているルームのIDを返します。 ここで返されるルームリストはサーバー全体のうち現クライアントが把握しているルームの分だけであり、実際のサーバーの状態を完全には反映しません。 このメソッドはそのクライアントが参加しているルームのIDを返しますが、それにはクライアントが単に観察しているルームのIDは含まれません。

戻り値のルームIDのリストはこのClientが入室しているルームリストの一時的なコピーであり、現クライアントがルームに入退室するときにも更新されません。

戻り値
Array — ルームIDの配列です。

関連項目

getPing()メソッド 
public function getPing():int

バージョン : Reactor 1.0.0

クライアントのping時間をミリ秒で返します。 "pingタイム"はメッセージがクライアントからサーバーに送信され、クライアントに戻ってくるまで(つまり、メッセージが完全に往復するまで)にかかる合計時間です。 クライアントのpingが不明な場合、getPing()は-1を返します。

デフォルトでは、各クライアントはサーバーに10秒ごとにpingを打ちます。getPing()は最後のping値(平均値ではありません)を返します。 デフォルトではまた、クライアントは他のクライアントとping値を共有しません。 ping値を共有するにはConnectionMonitorクラスを通して明示的に有効化しなければいけません。 getPing()メソッドはping値を共有していない、あるいは自動的にping値の計算が無効化されているクライアントについては-1を返します。 ping設定についての詳細はConnectionMonitorクラスを参照してください。

戻り値
int — 指定のクライアントにおける最後のping値です。ミリ秒あるいは不明なときには-1です。

関連項目



次のコードはルームにいる全てのクライアントのping値を表示するメソッドを示します。 (このコードはクライアントがConnectionMonitorのsharePing()メソッドを通してpingを共有していると仮定します。)
     public function showPings (room:Room):void {
       var clients:Array = room.getOccupants();
       for each (var client:int in clients) {
         trace("PING for client" + client.getClientID() 
               + " is: " + client.getPing());
       }
     }
     
getTimeOnline()メソッド 
public function getTimeOnline():Number

バージョン : Reactor 1.0.0

指定クライアントのサーバへの接続時間をミリ秒で返します。 このミリ秒値はサーバー上の近似された現在時間(ServerのgetServerTime()メソッドを通して取得されます)からクライアントの接続時間(ClientのgetConnectTime()メソッドを通して取得されます)を引く事で推定されます。

戻り値
Number — 指定クライアントがサーバーに接続してからの接続時間のミリ秒値です。

関連項目

isInRoom()メソッド 
public function isInRoom(roomID:String):Boolean

バージョン : Reactor 1.0.0

このクライアントが指定のルームに入室していることが把握されているかどうかを示す論理値を返します。 このメソッドが反映するのは現クライアントが認識しているルームであり、実際のサーバー状況ではないことに気をつけてください。 もし指定のルームが未同期でクライアントも未同期の場合、たとえそのクライアントが実際に指定のルームに入室している場合でも、isInRoom()は常にfalseを返します。 指定のroomIDにおいてisInRoom()の結果が正確であることを保証するためには、ルームに入室または観戦し、十分なルーム更新レベルをセットするか、Clientのobserve()メソッドかClientManagerのobserveClient()メソッドのどちらかを通してそのクライアントと同期してください。

パラメータ

roomID:String — 確認するルームのルームIDです。

戻り値
Boolean — このクライアントオブジェクトが指定のルームに入室していることを把握している場合にtrueを返します。

関連項目

isObservingRoom()メソッド 
public function isObservingRoom(roomID:String):Boolean

バージョン : Reactor 1.0.0

このクライアントが指定のルームを観戦していることが把握されているかどうかを示す論理値を返します。 このメソッドが反映するのは現クライアントが認識しているルームであり、実際のサーバー状況ではないことに気をつけてください。 もし指定のルームが未同期でクライアントも未同期の場合、たとえそのクライアントが実際に指定のルームを観戦している場合でも、isObservingRoom()は常にfalseを返します。 指定のroomIDにおいてisObservingRoom()の結果が正確であることを保証するためには、ルームに入室または観戦し、十分なルーム更新レベルをセットするか、Clientのobserve()メソッドかClientManagerのobserveClient()メソッドのどちらかを通してそのクライアントと同期してください。

パラメータ

roomID:String — 確認するルームのルームIDです。

戻り値
Boolean — このクライアントオブジェクトが指定のルームを観戦していることを把握している場合にtrueを返します。

関連項目

isSelf()メソッド 
public function isSelf():Boolean

バージョン : Reactor 1.0.0

このクライアントが現クライアントであればtrueを返します。 Reactorのself()メソッドを参照してください。

戻り値
Boolean

関連項目

kick()メソッド 
public function kick():void

バージョン : Reactor 1.0.0

このクライアントをサーバーから切断します。 管理者特権を要求します。

observe()メソッド 
public function observe():void

バージョン : Reactor 1.0.0

このクライアントの状態が常に同期を維持するようにサーバーに要求します。 結果的に、現クライアントは次のいずれかの時にいつでも通知されます:

サーバーからの通知は次のイベントをトリガーします:

observe()呼び出しの結果はClientEvent.OBSERVE_RESULTイベントを通して返されます。 もしその呼び出しが成功すると、ClientEvent.OBSERVEイベントがトリガーされます。 クライアントが最初に同期した後は、ClientEvent.SYNCHRONIZEイベントがトリガーされます。

関連項目

sendMessage()メソッド 
public function sendMessage(messageName:String, ... arguments):void

バージョン : Reactor 1.0.0

引数を備えたメッセージを他のクライアントに送信します。 メッセージを受信するためには、メッセージが到着したときに処理するための(1つあるいは複数の)メソッドを受信側のクライアントで定義します。 実行したい各メソッドはMessageManagerのaddMessageListener()メソッドを使用して別々にそのメッセージに登録します。

メッセージを単体のクライアントのかわりに特定のクライアントリスト向けに送信するには、ClientManager.sendMessage()を使用します。

パラメータ

messageName:String — そのクライアントに送信するメッセージ名です。
 
... arguments — オプションです。引数のストリング値をカンマで区切ったリストとしてこのメッセージに付与します。

関連項目



次のコードはdisplayPrivateMessage()メソッドを登録し、他のクライアントからの"PRIVATE_CHAT"メッセージを受信します。
messageManager.addMessageListener("PRIVATE_CHAT", displayPrivateMessage);
次のコードはsendMessage()を通して"PRIVATE_CHAT"メッセージをtheClientに送信します。
theClient.sendMessage("PRIVATE_CHAT", message);
次のコードはdisplayPrivateChat()メソッドを示します。このメソッドは受信した"PRIVATE_CHAT"メッセージを制御します。
    
     protected function displayPrivateChat (client:IClient, 
                                            msg:String):void {
       privateChatField.text = "Private message from: " + client.getClientID() 
                             + ": " + msg);
     }
     
setAttribute()メソッド 
public function setAttribute(attrName:String, attrValue:String, attrScope:String = null, isShared:Boolean = true, isUnique:Boolean = false, evaluate:Boolean = false):void

バージョン : Reactor 1.0.0

このクライアントにクライアント属性を設定します。 属性とその値はサーバーに格納・管理されます。 クライアント属性はクライアントについての情報を変数に似た形で含みます。 しかしながら、基本変数と異なり、クライアント属性とその値は他の接続中のクライアントとの間で共有できます。 ログインしたクライアントは後の参照用にデータベースか他のデータソースに情報を保存するためにユーザーアカウント属性を使用する事もできます(詳細はUserAccountクラスのsetAttribute()メソッドを参照してください)。

クライアント属性は、そのクライアントの名前、年齢、髪の色、得点などの特徴を追跡するために使用されます。 例えば、クライアントは次のように、"age"と名付けた属性に"39"という値を格納したりするでしょう。

    theClient.setAttribute("age", "39");
    

すると他の接続済みクライアントは次のように、Client.getAttribute()を通してそのクライアントの"age"属性を取得することで、その値"39"にアクセスできます:

    var client:Client = reactor.getClientManager().getClient(someClientID);
    var age:String = client.getAttribute("age");
    

加えて、そのクライアントが自身のageを"39"から"40"に変更しようとしていた場合、他の関心があるクライアントはその変更の通知を受けられます。 変更通知に対応することで他のクライアントは、例えば、チャットルームのユーザーリストを現在のユーザーの年齢について最新の状態に保つといったことができます。 次のコードはクライアント属性"age"の変更に応答するRoomEvent.UPDATE_CLIENT_ATTRIBUTEリスナーの使用方法を示します。

    protected function updateClientAttributeListener (e:RoomEvent):void {
      // 変更された属性が"age"なら、 
      // そのクライアントの新しい年齢を表示します。
      if (e.getChangedAttr().name == "age") {
        // "年齢変更"メッセージを表示します。
        trace(e.getClient() + " age changed to: " + e.getChangedAttr().value);
      }
    }
    

特定のクライアントの属性の変化の通知を受けるために、そのクライアントのAttributeEvent.UPDATEイベントを登録できます。

全てのクライアント属性は指定したルームか全ルームのどちらかをスコープとしていなければいけません。 全ルームをスコープとするクライアント属性は"グローバルクライアント属性"と呼ばれます。 属性のスコープはその属性が変更されたときにどのクライアントが更新されるのかを判定します。 例えば、あるクライアントが games.pongルームとchat.lobbyルームにいるとします。 そのクライアントが"games.pong"スコープ内で属性名"score"の値を"10"に設定します。

    theClient.setAttribute("score", "10", "games.pong");
    

これに対応して、games.pongルームにいる他のクライアントはそのクライアントの"score"属性が"10"に変更されたことを通知されます。 しかし、chat.lobbyルームにいるクライアントには通知されません。

次に、そのクライアントがnullをスコープとして"hairColour"という名前の属性を"brown"にセットすると仮定します (null はその属性がグローバルなスコープを持つことを示します)。

    theClient.setAttribute("hairColour", "brown", null);
    

応答として、games.pongchat.lobbyのどちらかに入室している他のクライアントはそのクライアントの"hairColour"属性が"brown"にセットされたという通知を受けます。 属性のスコープによってクライアントは他のルームとは別に、一つのルームにのみ関連づけた情報を持つことができます。

クライアント属性を完全に削除するには、ClientのdeleteAttribute()メソッドを使用してください。 例えば、次のコードはグローバルクライアント属性"hairColour"を削除します:

    theClient.deleteAttribute("hairColour");
    

クライアント属性が削除されるとき、そのクライアントが入室しているルームはRoomEvent.DELETE_CLIENT_ATTRIBUTEイベントをトリガーし、そのクライアントのClientオブジェクトはAttributeEvent.DELETEイベントをトリガーします。

クライアント属性はクライアントが切断するまでサーバーから削除されません。 アプリケーションはdeleteAttribute()を通して不要な属性を明示的に削除することが期待されます。 長い接続時間中に多数のクライアント属性を作成するようなアプリケーションは、各属性が不要となった時点で削除することでサーバー側のメモリーの累積を防がなくてはなりません。

デフォルトではサーバーとの通信において属性を区切るために内部的にパイプ文字("|")が使用されていることに気をつけてください。 そのため、属性名と値には"|"を含めることはできません。 詳細はTokens.RSを参照してください。

パラメータ

attrName:String — 属性名です。 パイプ文字("|")を含めてはいけません。
 
attrValue:String — 属性値です。 パイプ文字("|")を含めてはいけません。
 
attrScope:String (default = null) — 属性のスコープを示す完全修飾ルームIDです。 クライアントは属性のスコープとして使うためにそのルームに入室している必要はありません。 ただしクライアントが現在入っていないルームをスコープとした属性を設定しても、そのルームにいる他のクライアントはその属性の更新を通知されません。 グローバル属性(つまり全てのルームをスコープとする属性)を生成するためには、attrScopeをnullにします(デフォルト値です)。 (属性スコープとして利用するための)Roomオブジェクトの完全修飾ルームIDを取り出すためには、RoomクラスのgetRoomID()メソッドを使用します。
 
isShared:Boolean (default = true) — その属性が変更されるときに関連クライアントがその通知を受け取るか(true)、またはどのクライアントもその通知を受け取らないか(false)を示すフラグです。 属性の更新はRoomEvent.UPDATE_CLIENT_ATTRIBUTEとAttributeEvent.UPDATEのリスナーを通して制御します。 デフォルトはtrueです(共有される)。
 
isUnique:Boolean (default = false) — 複数のクライアントがこの属性について同じ値を持てる(falseの場合, デフォルト値)か、あるいは持ってはいけないか(trueの場合)を決定するフラグです。 例えば、クライアントが"username"属性を"Dave"に設定するとします。 そして二つ目のクライアントがisUniquetrueに設定された状態で"username"を"Dave"に設定しようと試みます。 するとその試行は失敗することになります。 この失敗の結果は二つ目のクライアントにAttributeEvent.SET_RESULTイベントを通して返されます。

ユニーク値のチェックが発生するのはisUniquetrueのときだけという点に注意してください。 これはその一回の属性割り当てにのみ影響し、属性自身には行われません。 例えば、三つ目のクライアントがisUniquefalseに設定された状態で"username"属性を"Dave"に設定しようとすると、その試行は成功します。 個別の属性割り当て呼び出しそれぞれが属性の重複を許可するかどうかを調べる責任を持ちます。

 
evaluate:Boolean (default = false) — trueの場合、サーバーは属性に新しい値を割り当てる前に、数値計算の表現としてattrValueを実行します。 この表現内では、"%v"というトークンは"属性の現在値への置換"を意味します。 例えば、次のコードは既存の属性"score"に1を加えます: theClient.setAttribute("score", "%v+1", true, false, true);. evaluateがtrueのとき、attrValueは次の文字のみを含むことができます: 0-9の数値, ., /, +, -, %, v

関連項目

setClientClass()メソッド 
public function setClientClass(scope:String, clientClass:Class, ... fallbackClasses):void

バージョン : Reactor 1.0.0

特定のスコープのルームにいる現クライアントのクラスを指定します。 グローバルなカスタムクライアントクラスを設定するためには、スコープをnullに設定してください。 指定したクラス(または指定したfallbackClassesのうちの一つ)は現クライアントを把握している他の全クライアントにおいて使用可能である必要があります。

通常は、カスタムクラスはCustomClientを拡張します。CustomClientはカスタムクライアントクラスのための基本テンプレートを提供します。 カスタムクラスがCustomClientの拡張ではない場合、手動で生のClientオブジェクトを組まなければなりません。これはClientManagerクラスのgetInternalClient()メソッドを通して取り出せます。

パラメータ

scope:String — このクライアントが指定のクラスを使用するルーム(複数可)です。 一つのルームIDか、全ルーム用にnullにできます。
 
clientClass:Class — このクライアントに使用するクラスです。 クラスは通常はCustomClientの派生ですが、IClientインターフェイスを実装したどんなクラスでも使えます。
 
... fallbackClasses — 指定したクライアントクラス名が見つからなかったときに使用するクラスのリストです。 代替クラスはクライアントが2つ以上のアプリケーションで使用される場合に便利で、各アプリケーションはそれぞれのクライアントを別々のクラスで表します。 例えば、チェスのクライアントがカスタムクライアントクラスであるChessClientとして表現されるとします。 管理ツールはより一般的なクラスであるGameClientを用いて、特定のクライアントを表現することになる様々なゲームのクライアントを表示します(この例では、GameClientクラスはChessClientクラスのスーパークラスになります)。 チェスアプリケーションと管理ツールの両方の必要に適応するために、クライアントはclientClassの引数にChessClientを、fallbackClassesにGameClientを設定します。 チェスアプリケーションはChessClientクラスへアクセスできるはずなので、クライアントを表すのにそのクラスを使用することになります。 管理ツールはChessClassにアクセスできないはずなので、代替としてGameClientクラスを使用することになります。 しかし、仮に管理ツールのアプリケーションドメインにChessClientがコンパイルされていた場合、GameClientのかわりにChessClientを使用してしまう点に注意してください。 これはfallbackClassesがその名前のとおり、clientClassが見つからなかったときの代替としてのみ使用されることを意味しています。

関連項目



     // 全ての部屋において現クライアントにChatClientをデフォルトとして割り当てます。
     // ここで設定されたデフォルト値は任意のRoomオブジェクトのsetDefaultClientClass()メソッド 
     // および現クライアントのsetClientClass()メソッドを用いることで
     // 指定のルームについて上書きできます。
     reactor.self().setClientClass(null, ChatClient);
     
     // "examples.chess"ルームのみにおいて現クライアントに
     // カスタムクラスChessClientを割り当てます(先行のデフォルト設定を上書きします)
     reactor.self().setClientClass("examples.chess", ChessClient);
     
     // chessRoomにおける全てのクライアントのデフォルトクラスにChessClientを設定します。
     // 結果として、chessRoom.getClient()を通して取り出したときに
     // カスタムクラスを指定しない全てのクライアントはChessClientのインスタンスとなります。
     chessRoom.setDefaultClientClass(ChessClient);
     
     // アプリケーション中の全てのクライアントのデフォルトクラスをChatClientに設定します。
     // 結果として明示的にカスタムクラスを設定するか、
     // デフォルトクライアントクラスが設定されたルームのgetClient()を通して取り出されない限りは、
     // アプリケーションにおける全てのクライアントはChatClientのインスタンスとなります。
     reactor.getClientManager().setDefaultClientClass(ChatClient);
     
     
stopObserving()メソッド 
public function stopObserving():void

バージョン : Reactor 1.0.0

このクライアントの観察を停止するようにサーバーに要求します。 結果的に、サーバーはクライアントの状態が変化する時にもう通知を送信しません。

stopObserving()呼び出しの結果はClientEvent.STOP_OBSERVING_RESULTイベントを通して返されます。 もしその呼び出しが成功すると、ClientEvent.STOP_OBSERVINGイベントもトリガーされます。

関連項目

toString()メソッド 
override public function toString():String

バージョン : Reactor 1.0.0

このオブジェクトのString表現を提供します。

戻り値
String
イベントの詳細
DELETE イベント
Event Object Type: AttributeEvent
AttributeEvent.type variable = net.user1.reactor.AttributeEvent.DELETE

属性が削除されるときに送出されます。

関連項目

DELETE_RESULT イベント  
Event Object Type: AttributeEvent
AttributeEvent.type variable = net.user1.reactor.AttributeEvent.DELETE_RESULT

属性の削除試行の結果を受信したときに送出されます。 試行結果を診断するには、getStatus()を使用します。これは次の値をとる可能性があります。

関連項目

JOIN_ROOM イベント  
Event Object Type: ClientEvent
ClientEvent.type variable = net.user1.reactor.ClientEvent.JOIN_ROOM

このイベントをトリガーしたクライアントがルームに入室するときに送出されます。

関連項目

LEAVE_ROOM イベント  
Event Object Type: ClientEvent
ClientEvent.type variable = net.user1.reactor.ClientEvent.LEAVE_ROOM

このイベントをトリガーしたクライアントがルームから退室するときに送出されます。 このイベントは対象のクライアントを含むルームが除去され、クライアントが退室を強制されるときにも発生します。

関連項目

LOGIN イベント  
Event Object Type: AccountEvent
AccountEvent.type variable = net.user1.reactor.AccountEvent.LOGIN

現クライアントによって把握されているクライアントのいずれかがログインするときに送出されます。 クライアントが現クライアントによって把握される状況のリストについては、ClientManagerのclientIsKnown()メソッドを参照してください。 しかしながら、RoomクラスのsetUpdateLevels()メソッドを通して"入室者ログインログオフ更新"と"観戦者ログインログオフ更新"を無効化することで、現クライアントがルーム入室者とルーム観戦者のログイン通知を受けないようにもできる点に留意してください。

AccountEvent.LOGINイベントはログインしたクライアントのClientオブジェクトを通して送出され、次にログインしたアカウントのUserAccountオブジェクト、次にAccountManagerからも送出されます。

関連項目

LOGOFF イベント  
Event Object Type: AccountEvent
AccountEvent.type variable = net.user1.reactor.AccountEvent.LOGOFF

現クライアントによって把握されているユーザーアカウントのいずれかがログオフするときに送出されます。 クライアントが現クライアントによって把握される状況のリストについては、ClientManagerのclientIsKnown()メソッドを参照してください。 しかしながら、RoomクラスのsetUpdateLevels()メソッドを通して"入室者ログインログオフ更新"と"観戦者ログインログオフ更新"を無効化することで、現クライアントがルーム入室者とルーム観戦者のログオフ通知を受けないようにもできる点に留意してください。

AccountEvent.LOGOFFイベントはログオフしたクライアントのClientオブジェクトを通して送出され、次にログオフしたアカウントのUserAccountオブジェクト、次にAccountManagerからも送出されます。

関連項目

OBSERVE イベント  
Event Object Type: ClientEvent
ClientEvent.type variable = net.user1.reactor.ClientEvent.OBSERVE

現クライアントがクライアントを観察するときに送出されます。 観察されるようになったクライアントにはClientEventのgetClient()メソッドを通してアクセスできます。

関連項目

OBSERVE_RESULT イベント  
Event Object Type: ClientEvent
ClientEvent.type variable = net.user1.reactor.ClientEvent.OBSERVE_RESULT

先に行われたClient.observe()かClientManager.observeClient()要求の結果を受信したときに送出されます。

関連項目

OBSERVE_ROOM イベント  
Event Object Type: ClientEvent
ClientEvent.type variable = net.user1.reactor.ClientEvent.OBSERVE_ROOM

このイベントをトリガーしたクライアントがルームの観戦を開始するときに送出されます。

関連項目

SET_RESULT イベント  
Event Object Type: AttributeEvent
AttributeEvent.type variable = net.user1.reactor.AttributeEvent.SET_RESULT

属性のセット試行の結果を受信したときに送出されます。 試行結果を診断するには、getStatus()を使用します。これは次の値をとる可能性があります。

関連項目

STOP_OBSERVING イベント  
Event Object Type: ClientEvent
ClientEvent.type variable = net.user1.reactor.ClientEvent.STOP_OBSERVING

現クライアントがクライアントの観察を停止するときに送出されます。 もはや観察されていないクライアントにはClientEventのgetClient()メソッドを通してアクセスできます。

関連項目

STOP_OBSERVING_RESULT イベント  
Event Object Type: ClientEvent
ClientEvent.type variable = net.user1.reactor.ClientEvent.STOP_OBSERVING_RESULT

先に行われたClient.stopObserving()かClientManager.stopObservingClient()要求の結果を受信したときに送出されます。

関連項目

STOP_OBSERVING_ROOM イベント  
Event Object Type: ClientEvent
ClientEvent.type variable = net.user1.reactor.ClientEvent.STOP_OBSERVING_ROOM

このイベントをトリガーしたクライアントがルームの観戦を停止するときに送出されます。 このイベントはそのクライアントを含むルームを除去するときにも発生し、クライアントにそのルームの観戦を強制的に停止させます。

関連項目

SYNCHRONIZE イベント  
Event Object Type: ClientEvent
ClientEvent.type variable = net.user1.reactor.ClientEvent.SYNCHRONIZE

このイベントをトリガーしたクライアントが先に行ったobserve()要求によってサーバー状態と一致するように同期したときに送出されます。

関連項目

UPDATE イベント  
Event Object Type: AttributeEvent
AttributeEvent.type variable = net.user1.reactor.AttributeEvent.UPDATE

属性が変化するか最初にセットされるときに送出されます。

関連項目