分类:
2008-07-14 12:46:15
Client class(客户端类)
可用性
Flash Communication Server 1.
客户端类让你处理每个连接到应用程序实例的用户或者客户。当用户连接到应用程序时服务器会自动创建一个Client对象;当用户从应用程序断开时对象被毁坏掉。用户们连接到每个应用程序时都会有不同的Client对象。数以千计的Client对象可以活动同一时间。
你可以使用Client类的属性来查看每个客户端的版本,平台和IP地址。你也可以为像Stream对象和共享对象一样的应用程序资源设置独立的读写权限。使用Client类的方法来设置带宽限制和调用在客户端脚本中的方法。
当你在客户端动作脚本中调用NetConnection.call()时,要在服务脚本中执行的方法必须是Client类的方法。你同样可以在服务端脚本中直接从服务端脚本的Client类实例调用你定义的任何方法。
如果所有的Client类实例(每个在应用程序中的客户)都请求相同的方法或者属性,你可以添加这些方法和属性到类本身来代替添加到每个类的实例上。这个处理被叫做扩展类。你可以扩展任何服务端或客户端动作脚本类。通过扩展类,来代替在类构造函数中定义方法或者把他们委派到单独的类实例上,你可以将方法委派到类构造函数的prototype属性上。当你委派方法和属性到prototype属性上时,这些方法将自用适用于所有的类实例。
下面的代码展示委派方法和属性到一个类的实例。在application.onConnect事件中,client实例clientObj被作为参数传递到服务端脚本中。你然后可以委派一个属性和方法到client实例上:
application.onConnect = function(clientObj){
clientObj.birthday = myBDay;
//Insert code here.
}
}
在上面的例子中,代码在每次客户连接时都必须执行。如果你不想每次为在application.clients数组中的所有客户定义相同的方法和属性的话,你必须把它们委派到Client类的prototype属性上。使用prototype方法扩展内之类有两个步骤。在你的脚本中你可以按任何顺序书写步骤。下面的例子扩展了内置Client类,第一步书写一个你将要委派给prototype属性的函数:
//第一步:书写函数
function Client_getWritePermission(){
//The writeAccess property is already built in to the client class.
return this.writeAccess;
}
function Client_createUniqueID(){
var ipStr = this.ip;
//The ip property is already built in the client class.
var uniqueID = "re123mn"
//You would need to write code in the above line
//that creates a unique ID for each client instance.
return uniqueID;
}
//第二步:委派函数给prototype方法
Client.prototype.getWritePermission = Client_getWritePermission;
Client.prototype.createUniqueID = Client_createUniqueID;
//A good naming convention is to start all class method
//names with the name of the class followed by an underscore.
你也可以为prototype增加属性,就像如下的例子:
Client.prototype.company = "Macromedia"
这些方法适用于所有的实例,在被传递了cliengObj参数的application.onConnect里面,你可以写下面的代码:
application.onConnect = function(clientObj){
var clientID = clientObj.createUnqueID();
var clientWritePerm = clientObj.getWritePermission();
};
Client类方法摘要 | |
方法(Method) | 描述(Description) |
Client.call() | 在Flash客户端异步执行这个方法并且从Flash客户端返回一个值到服务 |
Client.getBandwidthLimit() | 返回客户端的最大带宽或者是服务器可以企图用于这个连接的值 |
Client.getStats() | 返回客户的统计 |
Client.readAccess | 送一个"ping信息到客户端。如果客户端响应,方法返回true;否则返回false; |
Client.__resolve | 为未定义的属性提供一个值 |
Client.setBandwidthLimit() | 设置这个连接的最大带宽 |
Client类的属性摘要 | |
属性(Property) | 描述(Description) |
Client.agent | Read-only;Flash客户端的版本和运行平台 |
Client.ip | Read-only;Flash客户端的IP地址 |
Client.protocol | Read-only;被用于从客户端连接到服务器的协议 |
Client.readAccess | 一个访问级别表单;该表单决定用户对那些资源有可读权限; |
Client.referrer | Read-only;SWF文件的URL地址或者发起到连接服务器的目的地址 |
Client.secure | Read-only;一个布尔值指示internet连接是否为加密(ture)或者不加密(false). |
Client.uri | Read-only;被用户指定的连接到这个应用程序实例的URL地址 |
Client.virtualKey | 客户端的用户媒介类型(最典型的就是Flash Player的版本),但是允许被设置为任何合法的值 |
Client.writeAccess | 一个访问级别表单;该表单决定用户对那些资源有写入权限 |
Client类处理事件摘要 | |
处理事件(Event handle) | 描述(Description) |
lient."commandName | 当Netconnection.call(commandName)在客户端脚本被调用时调用 |
-----------------------------------------------------------
Client类(2)
Client.agent
可用性
Flash Communication Server MX 1.0
用法
clientObject.agent
描述
属性(read-only);包含Flash客户端的版本和平台信息
示例
如下的例子检查agent的属性是否对应字符串"WIN"并且在他们是否符合时执行不同的代码。这个代码被卸载onConnect函数中。
function onConnecct(newClient, name){
if(newClient.agent.indexOf("WIN") > -1){
trace("Window user");
}else{
trace("non Window user");
}
Client.call()
可用性
Flash Communication Server MX 1.0
用法
clientObject.call(methodName,[resultObj, [p1, ..., pN]])
参数
methodName 一个以[objectPath/]method形式指定方法。举例来说,命令someObj/doSomething告诉客户在客户端调用NetConnection.someObj.doSomething方法。
resultObj 可选参数,用来为当发送者期待从客户端返回一个值准备。如果你想传递参数而不想得到一个返回值,传递一个null给resultObj参数。result对象可以使任何你定义的对象,并且如果想它更有用,当结果到达时result对象应该有两个方法:onResult和onStatus.如果请求的远程方法成功resultObj.onResult事件将被触发,否则,resultObj.onStatus事件将被触发。
p1, ..., pN 可选参数,可以是任何动作脚本类型,包括一个其他动作脚本对象的引用。当方法在客户端执行时这些可选参数将被当作参数传递。如果你使用这些参数,你必须为resultObj参数传递一些值;如果你不想返回值,可以传递null.
返回
一个布尔值;如果在客户端上methodName请求成功返回true;否则为false.
描述
方法;在发起的Flash客户端或其他服务器上执行这个方法。远程方法可以随意地返回数据,如果给定了该数据,该数据被当作结果返回到resultObj参数中。Flash客户端到服务器的连接就是一个典型的远程对象的例子,但是它也可以使其他服务器。不管远程代理是否在Flash客户端或者是其他服务器,方法将会在远程代理的NetConnection对象上被调用。
示例
如下的例子展示在客户端脚本自定义一个名为rendom()地函数,用来产生一个随机数字:
nc = new NetConnection();
nc.connect("rtmp://someserver/someApp/someInst");
nc.random = function(){
retunr (Math.random());
};
下面的例子在服务端application.onConnect事件中用Client.call()方法调用定义在客户端中的random()方法。服务端脚本同样也定义了一个叫做randHander()函数,它被用来作为Client.call()方法的resultObj参数。
application.onConnect = function(clientObj){
trace("we are connected");
application.acceptConnection(clientObj);
clientObj.call("random", new randHanler());
};
randHandler = function(){
this.onResult = function(res){
trace("random num: " + res);
}
this.onStatus = function(info){
trace("failed and got: " +info.code);
}
}
Client."commandName"
可用性
Flash Communication Server MX 1.0
用法
function clientCommand([p1, ..., pN]){}
参数
p1, ..., pN 可选参数,如果这个信息含有你定义的参数它将被传递到命令消息事件中。这些动作脚本对象残被传递到NetConnection.call()方法。
返回
任何你自定义的动作脚本对象。这个对象被序列化并且被作为客户端回应传递到命令,仅仅在命令消息提供了一个回应时间时。
描述
处理事件;当Flash客户端或者其他服务器调用NetConnection.call()方法时调用。clientCommand参数的名称会被作为参数传递到NetConnection.call()中,用来导致Flash Meida服务器在服务端为Client对象实例方法搜寻匹配的clinetCommand参数的名称。如果发现了参数,方法被调用并且返回值被发送返回到客户端。
示例
如下的例子在服务端创建一个名为sum的方法作为Client对象newClient的属性:
newClient.sum = function sum(op1, op2){
return op1 +op2;
};
sum()方法可以在Flash客户端从NetConnection.call()如下面展示的例子一样被调用:
nc = new NetConnection();
nc.connect("rtmp://myServer/myApp");
nc.call("sum", new result(), 20, 50);
function result(){
this.onResult = function(retVal){
output += "sum is " + retVal;
};
this.onStatus = function(errorVal){
output += errorVal.code + " error occurred";
};
}
sum()方法也同样可以在服务端被调用,如下展示:
newClient.sum();
如下的例子创建两个函数,不管在客户端或者服务端中脚本中你都可以调用:
application.onConnect = function(clientObj){
//Add a callable function called "foo"; foo returns the number 8.
clientObj.foo = function(){return 8};
//Add a remote function that is not defined in the onConnect call,
clientObj.bar = application.barFunction;
};
application.barFunction = function(v1, v2){
return (v1 + v2);
};
在客户端脚本中你可以使用下面的代码调用上面例子中定义的被定义的两个函数:(foo和bar)
c = new NetConnection();
c.call("foo");
c.call("bar", null, 1, 1);
在服务端脚本中你可以使用下面的代码调用上面例子中定义的被定义的两个函数:(foo和bar)
c = new NetConnection();
c.onStatus = function(info){
if(info.code == "NetConnection.Connect.Success"){
c.call("foo");
c.call("bar", null, 2, 2);
}
}
---------------------------------------------------
Client类(3)
Client.getBandwidthLimit()
可用性
Flash Communication Server MX 1.0
用法
clientObject.getBandwidthLimit(iDirection)
参数
iDirection 一个整数指定连接的方向: 0 表示客户端到服务端,1 表示服务端到客户端。
返回
一个整数表示每秒的字节数
描述
方法;返回服务端或者客户端可用于这个连接的最大带宽。使用iDirection参数的值来设置连接的每个方向。返回的值显示每秒的字节数并且可以通过Client.setBandwidthLimit()方法更改。在Application.xml文件中设置连接到每个应用程序的默认带宽值。
示例
如下的例子使用Client.getBandwidthLimit()和iDirection参数一起设置两个变量,clientToServer 和serverToClient:
application.onConnect = function(newClient){
var clientToServer - newClient.getBandwidthLimit(0);
var serverToClient = newClient.getBandwidthLimit(1);
};
Client.getStats()
可用性
Flash Communication Server MX 1.0
用法
clientObject.getStats()
返回
为每个统计返回不同的属性对象
描述
方法;返回客户端的统计量包含发送和接收的字节总数,发送和接收RTMP消息的数量,丢失的RTMP消息数量,和该方法多久获得一个客户端响应的ping消息。
示例
如下的例子是用Client.getStats()来输出一个新的客户的统计:
application.onConnect = function(newClient){
stats = newClient.getStats();
trace("Total bytes reveived: " + stats.bytes_in);
trace("Total bytes sent: " + stats.bytes_out);
trace("RTMP messages received: " + stats.msg_in);
trace("RTMP messages sent: " + stats.msg_out);
trace("RTMP messages dropped: " + stats.msg_dropped);
trace("Ping roundtrip time: " + stats.ping_rtt);
}
另请参见
Client.readAccess
Client.ip
可用性
Flash Communication Server MX 1.0;
用法
clientObject.ip
描述
属性(read-only);一个包含Flash客户端IP地址的字符串
示例
下面的例子是用Client.ip属性来校验一个新的客户端是否为制定的IP地址。结果将用来判断那个模块代码会运行。
application.onConnect = function(newClient, name){
if (newClient.ip == "127.0.0.1"){
//Insert code here.
}else{
//Insert code here.
}
}
Client.ping()
可用性
Flash Communication Server MX 1.0
用法
clientObject.ping()
描述
方法;发送一个"Ping"消息到客户端并且等待一个回应。如果客户端回应,方法返回true;否则,返回false.使用这个方法校验一个客户端连接是否处于活动状态。
示例
如下的onConnect函数ping客户端连接并且跟踪方法的结果:
application.onConnect(newClient){
if(newClient.ping()){
trace("ping successful");
}else{
trace("ping failed");
}
}
另请参见
Client.getStats()
-----------------------------------------------------------------
Client类(4)
Client.protocol
可用性
Flash Communicatio Server MX 1.0
用法
clientObject.protocol
描述
属性(read-only);一个字符串表示被用于客户端连接到服务端的协议。这个字符串可以是下面的值之一:
1. rtmp(RTMP over a persistent socket connection)
2. rtmpt(RTMP tunneled using the HTTP protocol)
3. rtmps(RTMP over an SSL connection)
更多信息关于在Flash Communication Server MX 1.0上的关于HTTP连接渠道专题,请查看NetConnection.connect()方法在Flash media Server 2的客户端动作脚本语言参考中。
示例
如下的例子用来检查客户端连接到应用程序的协议:
application.onConnect(clientObj) {
if(clientObj.protocol == "rtmp") {
trace("Client connected over a persistent connection");
} else if(clientObj.protocol == "rtmpt"){
trace("Client connected over an HTTP tunneling connection");
}
}
Client.readAccess
可用性
Flash Communication Server MX 1.0
用法
clientObject.readAccess
描述
属性;一个字符串为这个客户提供到包含应用程序资源的目录的可读访问权限。字符串中的多个列表目录通过分号(;)来分割。
缺省状态下,所有的客户拥有该用户连接到的应用程序的全部资源的访问权限,并且readAccess属性被设置为"/"。为了给定一个用户的可读访问资源,指定一个访问层次列表(用URL形式),通过分号分割。任何通过URL指定的文件或目录同样要考虑可访问性。举个例子,如果myMedia被指定为可访问的级别,任何在myMedia目录中的文件或者目录都可以被访问(举个例子,myMedia/mp3s)。简单的说,任何在myMedia/mp3目录中的资源也同样可以访问,等等。
通过对一个包含streams的目录可读访问的设定,客户可以播放指定的访问层次中的streams。通过一个包含共享对象的目录的可读访问层次设定,客户可以订阅指定层次的共享对象。并且能接收到共享对象的更改通知。
1. 对于steams, readAccess控制连接者可以播放的streams
2. 对于共享对象,readAccess控制连接者是否能监听到关于共享对象的更改。
提示:你不可以使用这个属性来控制特别文件的访问,如果想控制对文件的访问你可以为它创建一个单独的目录。
示例
如下的onConnect函数给定用户到myMedia/mp3s, myData/notes中的任何文件和目录的可读访问权限:
application.onConnect = function(newClient, name){
newClient.readAccess = "myMedia/mp3s;myData/notes";
};
另请参见
Client.writeAccess
Client.referrer
可用性
Flash Communication Server MX 1.0
用法
clientObject.referrer
描述
属性(read-only);一个字符串,它的值为用于该目标连接的SWF文件或服务器的URL地址.
示例
如下的例子定义一个onConnect回调函数用来发送该属性值到客户端当客户连接到应用程序时:
application.onConnect = function(newClient, name){
trace("New user connected to server from " + newClient.referrer);
};
Client.__resolve
可用性
Flash COmmunication Server MX 1.0
用法
Client.__resolve = function(propName){}
参数
propName 未定义属性的名称
返回
通过propName参数指定的未定义属性的值
描述
处理事件;为未定义的属性提供一个值.当一个Client对象在服务端脚本中调用未定义的属性,这个对象将会检查__resolve方法.如果对象有__resolve方法,__resolve方法将被调用并且将propName的名字传递给未定义属性.__resolve返回值就是为定义属性的值.通过这个方法,__resolve可以为未定义属性提供值并且让它以定义方式出现.
示例
如下的例子定义一个函数用来在未定属性被调用时调用:
Client.prototype.__resolve = function(name){
return "Hello , world!";
}
function onConnect(newClient){
//Prints "Hello World".
trace(newClient.property1);
}
Client.secure
可用性
Flash Media Server 2
用法
clientObject.secure
描述
属性(read-only);一个布尔值表示当前Internet是否使用了安全连接,是为(true)否为(false)
另请参见
NetConnection.connect()
----------------------------------------------------------
Client类(5)
Client.setBandwidthLimit()
可用性
Flash Communication Server MX 1.0
用法
clientObject.setBandwidthLimit(iServerToClient, iClientToServer)
参数
iServerToClient 一个数字;服务器到客户端的带宽(每秒字节数).如果你不想改变当前的设置请给定0;
iClientToServer 一个数字;客户端到服务器的带宽(每秒字节数).如果你不想改变当前的设置请给定0;
返回
无
描述
方法;为这个用户设置最带的带宽(服务端到客户端,客户端到服务端,或两者).为每个连接到应用程序设置的默认带宽在Application.xml文件中.这个值不会更改在Apllication.xml文件中bandwidth标签的指定值.
示例
如下的例子设置每个方向的可用带宽,原来的值被传递到 onConnect函数中:
application.onConnect = function(newClient, serverToClient, clientToServer){
newClient.setBandwidthLimit(serverToClient, clientToServer);
application.acceptConnection(newClient);
}
Client.uri
可用性
Flash Media Server 2
用法
clientObject.uri
描述
属性(read-only);客户端指定连接到这个应用程序实例的URL值;
示例
如下的例子定义了一个onConnect回调函数用来输出一个含有新客户用于连接到应用程序的URL地址消息:
application.onConnect = function(newClient, name){
trace("New user requested to connect to " + newClient.uri);
}
Client.virtualKey
可用性
Flash Media Server 2
用法
clientObject.virtualKey
描述
属性;客户端用户的类型,典型的有Flash Play 的版本,但是可以被设置为任何类型值。一个合法的值可以包含任何字符串除了"*" 和":";
更多信息,请查看Stream.setVirtualPath()
Client.writeAccess
可用性
Flash Communication Server MX 1.0
用法
clientObject.writeAccess
描述
属性;一个字符串为这个客户提供到包含应用程序资源的目录的可写访问权限。字符串中的多个列表目录通过分号(;)来分割。
缺省状态下,所有的客户拥有该用户连接到的应用程序的全部资源的可写访问权限,并且writeAccess属性被设置为"/"。举个例子,如果myMedia被指定为可访问的级别,任何在myMedia目录中的文件或者目录都可以被访问(举个例子,myMedia/myStreams)。简单的说,任何在myMedia/myStreams目录中的资源也同样可以访问,等等。
1. 对于共享对象,writeAccess提供控制谁可以创建和更新共享对象.
2. 对于streams,writeAccess提供控制谁可以发布和录制stream.
提示:你不可以使用这个属性来控制特别文件的访问,如果想控制对文件的访问你可以为它创建一个单独的目录。
提示: 不要在客户端的stream路径头部前面使用(/)
示例
如下的例子提供到/myMedia/myStreams 和 myData/notes目录的可写访问:
application.onConnect = function(newClient, name){
newClient.writeAccess = "/myMedia/myStreams;myData/notes";
application.acceptConnection();
}