| パッケージ | net.user1.reactor |
| クラス | public class Client |
| 継承 | Client 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クラスを使用できます。
関連項目
| メソッド | 定義元 | ||
|---|---|---|---|
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 | ||
getConnectionState():int クライアントの現在のサーバーとの接続状態を表します。 | Client | ||
getConnectTime():Number このクライアントが接続したときにサーバーによって設定された時間を返します。 | Client | ||
getIP():String もし利用可能であれば、このクライアントのIPアドレスを返します。 | Client | ||
getObservedRoomIDs():Array このクライアントが観戦していると把握されているルームのIDを返します。 | Client | ||
getOccupiedRoomIDs():Array このクライアントが入室していると把握されているルームの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 | ||
stopObserving():void このクライアントの観察を停止するようにサーバーに要求します。 | Client | ||
toString():String [オーバーライド] このオブジェクトのString表現を提供します。 | Client | ||
| 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) — 取り出す属性名です。 |
String — attrNameで指定した属性のストリング値を返します。 |
関連項目
| 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";
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";
Object |
関連項目
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}}
例えば、あるクライアントが次のような二つの属性を持つとします。 var o:Object = new Object();
o[Tokens.GLOBAL_ATTR]["username"] = "derek";
o["games.pong"]["score"] = 8;var o:Object = new Object();
o["username"] = "derek";
o["games.pong.score"] = 8;パラメータ
scope:String (default = null) |
Object — 与えられたスコープ、あるいは全スコープにおけるこのClientの属性を含むジェネリックなオブジェクトです。 |
関連項目
// クライアントの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 (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());
theClient.getAttribute("_CT");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です。 |
関連項目
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 — オプションです。引数のストリング値をカンマで区切ったリストとしてこのメッセージに付与します。 |
関連項目
messageManager.addMessageListener("PRIVATE_CHAT", displayPrivateMessage);theClient.sendMessage("PRIVATE_CHAT", message);
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.pongとchat.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"に設定するとします。 そして二つ目のクライアントがisUniqueがtrueに設定された状態で"username"を"Dave"に設定しようと試みます。 するとその試行は失敗することになります。 この失敗の結果は二つ目のクライアントにAttributeEvent.SET_RESULTイベントを通して返されます。 ユニーク値のチェックが発生するのは | |
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 | イベント |
AttributeEventnet.user1.reactor.AttributeEvent.DELETE属性が削除されるときに送出されます。
関連項目
| DELETE_RESULT | イベント |
AttributeEventnet.user1.reactor.AttributeEvent.DELETE_RESULT
属性の削除試行の結果を受信したときに送出されます。 試行結果を診断するには、getStatus()を使用します。これは次の値をとる可能性があります。
関連項目
| JOIN_ROOM | イベント |
ClientEventnet.user1.reactor.ClientEvent.JOIN_ROOMこのイベントをトリガーしたクライアントがルームに入室するときに送出されます。
関連項目
| LEAVE_ROOM | イベント |
ClientEventnet.user1.reactor.ClientEvent.LEAVE_ROOMこのイベントをトリガーしたクライアントがルームから退室するときに送出されます。 このイベントは対象のクライアントを含むルームが除去され、クライアントが退室を強制されるときにも発生します。
関連項目
| LOGIN | イベント |
AccountEventnet.user1.reactor.AccountEvent.LOGIN
現クライアントによって把握されているクライアントのいずれかがログインするときに送出されます。 クライアントが現クライアントによって把握される状況のリストについては、ClientManagerのclientIsKnown()メソッドを参照してください。 しかしながら、RoomクラスのsetUpdateLevels()メソッドを通して"入室者ログインログオフ更新"と"観戦者ログインログオフ更新"を無効化することで、現クライアントがルーム入室者とルーム観戦者のログイン通知を受けないようにもできる点に留意してください。
AccountEvent.LOGINイベントはログインしたクライアントのClientオブジェクトを通して送出され、次にログインしたアカウントのUserAccountオブジェクト、次にAccountManagerからも送出されます。
関連項目
| LOGOFF | イベント |
AccountEventnet.user1.reactor.AccountEvent.LOGOFF
現クライアントによって把握されているユーザーアカウントのいずれかがログオフするときに送出されます。 クライアントが現クライアントによって把握される状況のリストについては、ClientManagerのclientIsKnown()メソッドを参照してください。 しかしながら、RoomクラスのsetUpdateLevels()メソッドを通して"入室者ログインログオフ更新"と"観戦者ログインログオフ更新"を無効化することで、現クライアントがルーム入室者とルーム観戦者のログオフ通知を受けないようにもできる点に留意してください。
AccountEvent.LOGOFFイベントはログオフしたクライアントのClientオブジェクトを通して送出され、次にログオフしたアカウントのUserAccountオブジェクト、次にAccountManagerからも送出されます。
関連項目
| OBSERVE | イベント |
ClientEventnet.user1.reactor.ClientEvent.OBSERVE現クライアントがクライアントを観察するときに送出されます。 観察されるようになったクライアントにはClientEventのgetClient()メソッドを通してアクセスできます。
関連項目
| OBSERVE_RESULT | イベント |
ClientEventnet.user1.reactor.ClientEvent.OBSERVE_RESULT先に行われたClient.observe()かClientManager.observeClient()要求の結果を受信したときに送出されます。
関連項目
| OBSERVE_ROOM | イベント |
ClientEventnet.user1.reactor.ClientEvent.OBSERVE_ROOMこのイベントをトリガーしたクライアントがルームの観戦を開始するときに送出されます。
関連項目
| SET_RESULT | イベント |
AttributeEventnet.user1.reactor.AttributeEvent.SET_RESULT
属性のセット試行の結果を受信したときに送出されます。 試行結果を診断するには、getStatus()を使用します。これは次の値をとる可能性があります。
関連項目
| STOP_OBSERVING | イベント |
ClientEventnet.user1.reactor.ClientEvent.STOP_OBSERVING現クライアントがクライアントの観察を停止するときに送出されます。 もはや観察されていないクライアントにはClientEventのgetClient()メソッドを通してアクセスできます。
関連項目
| STOP_OBSERVING_RESULT | イベント |
ClientEventnet.user1.reactor.ClientEvent.STOP_OBSERVING_RESULT先に行われたClient.stopObserving()かClientManager.stopObservingClient()要求の結果を受信したときに送出されます。
関連項目
| STOP_OBSERVING_ROOM | イベント |
ClientEventnet.user1.reactor.ClientEvent.STOP_OBSERVING_ROOMこのイベントをトリガーしたクライアントがルームの観戦を停止するときに送出されます。 このイベントはそのクライアントを含むルームを除去するときにも発生し、クライアントにそのルームの観戦を強制的に停止させます。
関連項目
| SYNCHRONIZE | イベント |
ClientEventnet.user1.reactor.ClientEvent.SYNCHRONIZEこのイベントをトリガーしたクライアントが先に行ったobserve()要求によってサーバー状態と一致するように同期したときに送出されます。
関連項目
| UPDATE | イベント |
AttributeEventnet.user1.reactor.AttributeEvent.UPDATE属性が変化するか最初にセットされるときに送出されます。
関連項目