| 包 | flash.net |
| 类 | public class NetGroup |
| 继承 | NetGroup EventDispatcher Object |
| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
-
监视服务质量
info属性包含一个 NetGroupInfo 对象,该对象的属性为此组提供 QOS 统计数据。 -
发布。调用
post()以为组中的所有成员广播 ActionScript 消息。 -
直接路由。调用
sendToNearest()、sendToNeighbor()和sendToAllNeighbors()以将短数据消息发送给对等组中的特定成员。源和目标不需要进行直接连接。 -
对象复制。调用
addHaveObjects()、removeHaveObjects()、addWantObjects()、removeWantObjects()、writeRequestedObject()和denyRequestedObject()以将大型数据分解成数据片段,然后将其复制到对等组中的所有节点。
在客户端 NetGroup 类中,NetConnection 会调度以下事件:
- NetGroup.Connect.Success
- NetGroup.Connect.Failed
- NetGroup.Connect.Rejected
该事件对象的 info.group 属性包含对事件源 (NetGroup) 的引用。NetGroup 会调度所有其他事件。在服务器端 NetGroup 类中,NetGroup 会调度所有事件。
有关使用组合对等协助网络的信息,请参阅同样由 Tom Krcha 编写的使用 Flash Media 和 RTMFP 的社交媒体体验。
有关对等协助网络技术细节的信息,请参阅 Adobe 计算机科学家 Matthew Kaufman 编写的采用 RTMFP 的 Flash 平台上的 P2P。
相关 API 元素
| 属性 | 由以下参数定义 | ||
|---|---|---|---|
![]() | constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | |
| estimatedMemberCount : Number [只读]
根据本地邻点的密度并假设组地址均匀分布来指定估计的组成员数。 | NetGroup | ||
| info : NetGroupInfo [只读]
返回一个 NetGroupInfo 对象,其属性提供有关此 NetGroup 的 RTMFP 对等数据传输的服务质量统计信息。 | NetGroup | ||
| localCoverageFrom : String [只读]
指定此节点距离“最近”并对其负责的组地址的开始范围。 | NetGroup | ||
| localCoverageTo : String [只读]
指定此节点距离“最近”并对其负责的组地址的结尾范围。 | NetGroup | ||
| neighborCount : Number [只读]
指定与此节点直接连接的组成员数。 | NetGroup | ||
| receiveMode : String
指定此节点的路由接收模式作为 NetGroupReceiveMode enum 类中的一个值。 | NetGroup | ||
| replicationStrategy : String
指定对象复制获取策略。 | NetGroup | ||
| 方法 | 由以下参数定义 | ||
|---|---|---|---|
在指定的 NetConnection 对象上构造一个 NetGroup 并将其加入到 groupspec 指定的组。 | NetGroup | ||
![]() | addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
使用 EventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。 | EventDispatcher | |
将从 startIndex 到 endIndex 的对象添加到对象集,此节点将对象集作为要完成其请求的对象向邻居播发。 | NetGroup | ||
手动添加一个记录以指定 peerID 为组成员。 | NetGroup | ||
通过立即直接连接到指定的 peerID 手动添加邻居,该 peerID 必须位于此组中。 | NetGroup | ||
将从 startIndex 到 endIndex 的对象添加到要检索的对象集。 | NetGroup | ||
断开与组的连接,然后关闭此 NetGroup。 | NetGroup | ||
将 peerID 转换为适合与 sendToNearest() 方法一起使用的组地址。 | NetGroup | ||
拒绝 NetStatusEvent NetGroup.Replication.Request 中收到的针对先前使用 addHaveObjects() 播发的对象的请求。 | NetGroup | ||
![]() |
将事件调度到事件流中。 | EventDispatcher | |
![]() |
检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。 | EventDispatcher | |
![]() |
表示对象是否已经定义了指定的属性。 | Object | |
![]() |
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | |
将消息发送给组中的所有成员。 | NetGroup | ||
![]() |
表示指定的属性是否存在、是否可枚举。 | Object | |
![]() |
从 EventDispatcher 对象中删除侦听器。 | EventDispatcher | |
将从 startIndex 到 endIndex 的对象从对象集中删除,此节点将对象集作为其完成请求的对象播发到邻居。 | NetGroup | ||
从要检索的对象集中删除从 startIndex 到 endIndex 的对象。 | NetGroup | ||
将消息发送给所有邻居。 | NetGroup | ||
将消息发送给最接近指定的组地址的邻居(或本地节点)。 | NetGroup | ||
将消息发送到由 sendMode 参数指定的邻居。 | NetGroup | ||
![]() |
设置循环操作动态属性的可用性。 | Object | |
![]() |
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | |
![]() |
返回指定对象的字符串表示形式。 | Object | |
![]() |
返回指定对象的原始值。 | Object | |
![]() |
检查是否用此 EventDispatcher 对象或其任何祖代为指定事件类型注册了事件侦听器。 | EventDispatcher | |
当 NetStatusEvent NetGroup.Replication.Request 收到针对先前使用 addHaveObjects() 方法播发的对象的请求时,满足请求。 | NetGroup | ||
| 事件 | 摘要 | 由以下参数定义 | ||
|---|---|---|---|---|
![]() | [广播事件] Flash Player 或 AIR 应用程序获得操作系统焦点并变为活动状态时将调度此事件。 | EventDispatcher | ||
![]() | [广播事件] Flash Player 或 AIR 应用程序失去操作系统焦点并变为非活动状态时将调度此事件。 | EventDispatcher | ||
| 在 NetGroup 对象报告其状态或错误条件时调度。 | NetGroup | |||
estimatedMemberCount | 属性 |
info | 属性 |
info:NetGroupInfo [只读] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
返回一个 NetGroupInfo 对象,其属性提供有关此 NetGroup 的 RTMFP 对等数据传输的服务质量统计信息。
实现
public function get info():NetGroupInfo相关 API 元素
localCoverageFrom | 属性 |
localCoverageTo | 属性 |
neighborCount | 属性 |
receiveMode | 属性 |
replicationStrategy | 属性 |
NetGroup | () | 构造函数 |
public function NetGroup(connection:NetConnection, groupspec:String)| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
在指定的 NetConnection 对象上构造一个 NetGroup 并将其加入到 groupspec 指定的组。
大多数情况下,groupspec 有可能使用本地系统上的网络上行链路。当使用 groupspec 构造 NetStream 或 NetGroup 对象时,Flash Player 将显示一个“隐私”对话框。该对话框询问 Flash Player 是否可以使用连接与用户的同级共享数据。如果用户单击“允许此域”,则用户下一次连接到此应用程序时将不显示该对话框。如果用户不允许对等协助网络,则将禁用组中的所有对等功能(发布、定向路由、对象复制和多播)。如果允许此权限,则会使用 info 对象的 code 属性中的 NetGroup.Connect.Success 将 NetStatusEvent 发送到 NetConnection 的事件侦听器。如果拒绝此权限,code 属性是 NetGroup.Connect.Rejected。在接收到 NetGroup.Connect.Success 事件之前,如果您尝试调用 NetGroup 对象的任何方法,将引发异常。
注意:当客户端订阅本机 IP 多播流时,不显示安全对话框。
参数connection:NetConnection — 一个 NetConnection 对象。
| |
groupspec:String — 指定要加入的 RTMFP 对等组的字符串,包括其名称、该成员的能力、限制和授权。
new NetGroup(myConnection, myGroupSpecifier.groupspecWithAuthorizations());
|
引发
ArgumentError — 未连接 NetConnection 实例。
| |
Error — 此 groupspec 无效。
|
相关 API 元素
addHaveObjects | () | 方法 |
public function addHaveObjects(startIndex:Number, endIndex:Number):void| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
将从 startIndex 到 endIndex 的对象添加到对象集,此节点将对象集作为要完成其请求的对象向邻居播发。默认情况下,Have 集为空。索引必须是介于 0 和 9007199254740992 之间的整数。
有关对象复制的详细信息,请参阅《Flash Media Server 开发人员指南》中的“在组内复制对象”。
此方法使用 info 对象的 code 属性中的 "NetGroup.Replication.Request" 将 NetStatusEvent 发送到 NetGroup 的事件侦听器。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
startIndex:Number — 要添加到 Have 集的对象索引的起始范围。
| |
endIndex:Number — 要添加到 Have 集的对象索引的结束范围。
|
引发
RangeError — 传递给此方法的数字小于 0 或大于 9007199254740992。
|
相关 API 元素
addMemberHint | () | 方法 |
addNeighbor | () | 方法 |
addWantObjects | () | 方法 |
public function addWantObjects(startIndex:Number, endIndex:Number):void| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
将从 startIndex 到 endIndex 的对象添加到要检索的对象集。索引必须是介于 0 和 9007199254740992 之间的整数。默认情况下,Want 集为空。
有关对象复制的详细信息,请参阅《Flash Media Server 开发人员指南》中的“在组内复制对象”。
此方法使用 info.code 属性中的 NetGroup.Replication.Fetch.SendNotify 将 NetStatusEvent 发送到 NetGroup 的事件侦听器。此事件后跟 NetGroup.Replication.Fetch.Failed 或 NetGroup.Replication.Fetch.Result 事件。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
startIndex:Number — 要添加到 Want 集的对象索引的起始范围。
| |
endIndex:Number — 要添加到 Want 集的对象索引的结束范围。
|
引发
RangeError — 传递给此方法的数字小于 0 或大于 9007199254740992。
|
相关 API 元素
close | () | 方法 |
public function close():void| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
断开与组的连接,然后关闭此 NetGroup。此 NetGroup 在调用此方法后不可用。
convertPeerIDToGroupAddress | () | 方法 |
denyRequestedObject | () | 方法 |
public function denyRequestedObject(requestID:int):void| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
拒绝 NetStatusEvent NetGroup.Replication.Request 中收到的针对先前使用 addHaveObjects() 播发的对象的请求。请求者可能再次请求此对象,除非或直到它从 Have 集撤出。
有关对象复制的详细信息,请参阅《Flash Media Server 开发人员指南》中的“在组内复制对象”。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
requestID:int — 在 NetGroup.Replication.Request 事件中给定的请求标识符。
|
相关 API 元素
post | () | 方法 |
public function post(message:Object):String| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
将消息发送给组中的所有成员。要调用此方法,则 GroupSpecifier.postingEnabled 属性在已传递给 NetGroup 构造函数的 groupspec 中必须为 true。有关详细信息,请参阅《Flash Media Server 开发人员指南》中的“向组发布消息”。
所有消息都必须是唯一的;与早期发送的某一消息相同的消息可能不会传播。使用序列号使消息是唯一的。
消息传送没有顺序。无法保证消息传送。
消息在 AMF 中进行序列化。消息可以是下列类型之一:对象、整数、数字或字符串。消息不能是 MovieClip。
此方法使用 info.code 属性中的 "NetGroup.Posting.Notify" 将 NetStatusEvent 发送到 NetGroup 的事件侦听器。"NetGroup.Posting.Notify" 事件被调度到客户端和服务器上的 NetGroup。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
message:Object — 要发送给组中的所有其他成员的消息。
|
String — 如果发送,则为消息的 messageID;若出现错误,则为 null。messageID 是消息的序列化的原始字节的十六进制 SHA256。
|
相关 API 元素
示例 ( 如何使用本示例 )
运行应用程序时,可以在文本输入字段中输入任何组名称。GroupSpecifier 类使用该名称(以及您设置的所有 GroupSpecifier 属性)来创建字符串,该字符串为该组的终身唯一名称。要将另一个客户端连接到该组,该客户端必须使用相同的组名称。例如,如果客户端 A 使用组名称“firstmesh”,要与客户端 A 通讯的其他客户端也必须使用组名称“firstmesh”。如果客户端 B 使用组名称“kite”,它将成功连接,但会创建一个新组,并将无法与“firstmesh”组中的客户端 A 或任何人进行通讯。
要运行此示例,将 Button、Label、TextInput 和 TextArea 组件添加到 Flash Pro 中的库。
package {
import flash.display.Sprite;
import flash.events.TextEvent;
import flash.events.MouseEvent;
import flash.events.NetStatusEvent;
import fl.events.ComponentEvent;
import fl.controls.Label;
import fl.controls.Button;
import fl.controls.TextInput;
import fl.controls.TextArea;
import flash.text.TextFieldAutoSize;
import flash.net.*;
public class NetGroupPostExample extends Sprite{
private var connectButton:Button;
private var disconnectButton:Button;
private var groupNameText:TextInput;
private var userNameText:TextInput;
private var chatText:TextInput;
private var statusLog:TextArea;
private var groupLabel:Label;
private var userLabel:Label;
private var netConnection:NetConnection = null;
private var netGroup:NetGroup = null;
private var sequenceNumber:uint = 0;
private var connected:Boolean = false;
private var joinedGroup:Boolean = false;
private const SERVER:String = "rtmfp://fms.example.com/someapp";
public function NetGroupPostExample() {
DoUI();
}
// Writes messages to the TextArea.
private function StatusMessage(msg:Object):void{
statusLog.text += msg;
statusLog.verticalScrollPosition = statusLog.textHeight;
statusLog.validateNow();
}
// Handles all NetStatusEvents for the NetConnection and the NetGroup.
// This code includes cases it doesn't handle so you can see the cases
// and their info objects for learning purposes.
private function NetStatusHandler(e:NetStatusEvent):void{
StatusMessage(e.info.code + "\n");
switch(e.info.code){
case "NetConnection.Connect.Success":
connectButton.enabled = false;
disconnectButton.enabled = true;
OnConnect();
break;
case "NetConnection.Connect.Closed":
OnDisconnect();
break;
case "NetGroup.Connect.Success": // e.info.group
OnNetGroupConnect();
break;
case "NetGroup.Connect.Rejected": // e.info.group
case "NetGroup.Connect.Failed": // e.info.group
break;
case "NetGroup.Posting.Notify": // e.info.message, e.info.messageID
OnPosting(e.info.message);
break;
case "NetStream.MulticastStream.Reset":
case "NetStream.Buffer.Full":
break;
case "NetGroup.SendTo.Notify": // e.info.message, e.info.from, e.info.fromLocal
case "NetGroup.LocalCoverage.Notify": //
case "NetGroup.Neighbor.Connect": // e.info.neighbor
case "NetGroup.Neighbor.Disconnect": // e.info.neighbor
case "NetGroup.MulticastStream.PublishNotify": // e.info.name
case "NetGroup.MulticastStream.UnpublishNotify": // e.info.name
case "NetGroup.Replication.Fetch.SendNotify": // e.info.index
case "NetGroup.Replication.Fetch.Failed": // e.info.index
case "NetGroup.Replication.Fetch.Result": // e.info.index, e.info.object
case "NetGroup.Replication.Request": // e.info.index, e.info.requestID
default:
break;
}
}
// Creates a NetConnection to Flash Media Server if the app isn't already connected
// and if there's a group name in the TextInput field.
private function DoConnect(e:MouseEvent):void{
if(!connected && (groupNameText.length > 0)){
StatusMessage("Connecting to \"" + SERVER + "\" ...\n");
netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
// To connect to Flash Media Server, pass the server name.
netConnection.connect(SERVER);
}
else
{
StatusMessage("Enter a group name");
}
}
// Called in the "NetConnection.Connect.Success" case in the NetStatusEvent handler.
private function OnConnect():void{
StatusMessage("Connected\n");
connected = true;
// Create a GroupSpecifier object to pass to the NetGroup constructor.
// The GroupSpecifier determines the properties of the group
var groupSpecifier:GroupSpecifier;
groupSpecifier = new GroupSpecifier("aslrexample/" + groupNameText.text);
groupSpecifier.postingEnabled = true;
groupSpecifier.serverChannelEnabled = true;
netGroup = new NetGroup(netConnection, groupSpecifier.groupspecWithAuthorizations());
netGroup.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
StatusMessage("Join \"" + groupSpecifier.groupspecWithAuthorizations() + "\"\n");
}
private function OnNetGroupConnect():void{
joinedGroup = true;
}
private function DoDisconnect(e:MouseEvent):void{
if(netConnection){
netConnection.close();
}
}
private function OnDisconnect():void{
StatusMessage("Disconnected\n");
netConnection = null;
netGroup = null;
connected = false;
joinedGroup = false;
connectButton.enabled = true;
disconnectButton.enabled = false;
}
private function ClearChatText():void{
chatText.text = "";
}
// Called when you the chatText field has focus and you press Enter.
private function DoPost(e:ComponentEvent):void{
if(joinedGroup){
var message:Object = new Object;
message.user = userNameText.text;
message.text = chatText.text;
message.sequence = sequenceNumber++;
message.sender = netConnection.nearID;
netGroup.post(message);
StatusMessage("==> " + chatText.text + "\n");
} else {
StatusMessage("Click Connect before sending a chat message");
}
ClearChatText();
}
private function OnPosting(message:Object):void{
StatusMessage("<" + message.user + "> " + message.text + "\n");
}
private function DoUI():void {
groupLabel = new Label();
groupLabel.move(20, 10);
groupLabel.autoSize = TextFieldAutoSize.LEFT
groupLabel.text = "Group name:"
addChild(groupLabel);
groupNameText = new TextInput();
groupNameText.move(90, 10);
groupNameText.text = "channel" + (int(Math.random() * 899) + 101);
addChild(groupNameText);
connectButton = new Button();
connectButton.addEventListener(MouseEvent.CLICK, DoConnect);
connectButton.move(205, 10);
connectButton.label = "Connect";
addChild(connectButton);
disconnectButton = new Button();
disconnectButton.addEventListener(MouseEvent.CLICK, DoDisconnect);
disconnectButton.move(310, 10);
disconnectButton.label = "Disconnect";
disconnectButton.enabled = false;
addChild(disconnectButton);
statusLog = new TextArea();
statusLog.move(30, 38);
statusLog.width = 360;
statusLog.height = 215;
statusLog.editable = false;
addChild(statusLog);
userLabel = new Label();
userLabel.move(20, 270);
userLabel.autoSize = TextFieldAutoSize.LEFT
userLabel.text = "User name:"
addChild(userLabel);
userNameText = new TextInput();
userNameText.move(80, 270);
userNameText.text = "user " + int(Math.random() * 65536);
addChild(userNameText);
chatText = new TextInput();
chatText.addEventListener(ComponentEvent.ENTER, DoPost);
chatText.move(185, 270);
chatText.maxChars = 255;
chatText.width = 215;
addChild(chatText);
}
public function onPlayStatus(info:Object):void {}
public function onMetaData(info:Object):void {}
public function onCuePoint(info:Object):void {}
public function onTextData(info:Object):void {}
}
}
removeHaveObjects | () | 方法 |
public function removeHaveObjects(startIndex:Number, endIndex:Number):void| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
将从 startIndex 到 endIndex 的对象从对象集中删除,此节点将对象集作为其完成请求的对象播发到邻居。索引必须是介于 0 和 9007199254740992 之间的整数。
有关对象复制的详细信息,请参阅《Flash Media Server 开发人员指南》中的“在组内复制对象”。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
startIndex:Number — 要从 Have 集删除的对象索引的起始范围。
| |
endIndex:Number — 要从 Have 集删除的对象索引的结束范围。
|
引发
RangeError — 传递给此方法的数字小于 0 或大于 9007199254740992。
|
相关 API 元素
removeWantObjects | () | 方法 |
public function removeWantObjects(startIndex:Number, endIndex:Number):void| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
从要检索的对象集中删除从 startIndex 到 endIndex 的对象。索引必须是介于 0 和 9007199254740992 之间的整数。
有关对象复制的详细信息,请参阅《Flash Media Server 开发人员指南》中的“在组内复制对象”。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
startIndex:Number — 从 Want 集删除的对象索引的起始范围。
| |
endIndex:Number — 从 Want 集删除的对象索引的结束范围。
|
引发
RangeError — 传递给此方法的数字小于 0 或大于 9007199254740992。
|
相关 API 元素
sendToAllNeighbors | () | 方法 |
public function sendToAllNeighbors(message:Object):String| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
将消息发送给所有邻居。如果选择了至少一个邻居,则返回 NetGroupSendResult.SENT。
有关路由消息的详细信息,请参阅《Flash Media Server 开发人员指南》中的“将消息直接路由到同级”。
当节点接收消息时,NetStatusEvent 将发送到 NetGroup 的事件侦听器,其中 info 对象的 code 属性为 NetGroup.SendTo.Notify。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
message:Object — 要发送的消息。
|
String — 枚举类 NetGroupSendResult 的属性表示发送成功或失败。
|
相关 API 元素
sendToNearest | () | 方法 |
public function sendToNearest(message:Object, groupAddress:String):String| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
将消息发送给最接近指定的组地址的邻居(或本地节点)。考虑整个环上的邻居。如果消息成功发送到其目标,则返回 NetGroupSendResult.SENT。
有关路由消息的详细信息,请参阅《Flash Media Server 开发人员指南》中的“将消息直接路由到同级”。
当节点接收消息时,NetStatusEvent 将发送到 NetGroup 的事件侦听器,其中 info 对象的 code 属性为 NetGroup.SendTo.Notify。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
message:Object — 要发送的消息。
| |
groupAddress:String — 向其路由消息的组地址。
|
String — 枚举类 NetGroupSendResult 的属性表示发送成功或失败。
|
相关 API 元素
sendToNeighbor | () | 方法 |
public function sendToNeighbor(message:Object, sendMode:String):String| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
将消息发送到 sendMode 参数指定的邻居。如果消息成功发送到其请求目标,则返回 NetGroupSendResult.SENT。
有关路由消息的详细信息,请参阅《Flash Media Server 开发人员指南》中的“将消息直接路由到同级”。
当节点接收消息时,NetStatusEvent 将发送到 NetGroup 的事件侦听器,其中 info 对象的 code 属性为 NetGroup.SendTo.Notify。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
message:Object — 要发送的消息。
| |
sendMode:String — 枚举类 NetGroupSendMode 的属性指定向其发送消息的邻居。
|
String — 枚举类 NetGroupSendResult 的属性表示发送成功或失败。
|
相关 API 元素
writeRequestedObject | () | 方法 |
public function writeRequestedObject(requestID:int, object:Object):void| 语言版本: | ActionScript 3.0 |
| 运行时版本: | Flash Player 10.1, AIR 2 |
当 NetStatusEvent NetGroup.Replication.Request 收到针对先前使用 addHaveObjects() 方法播发的对象的请求时,满足请求。object 可以是下列任何类型:对象、整数、数字和字符串。object 不能是 MovieClip。
有关对象复制的详细信息,请参阅《Flash Media Server 开发人员指南》中的“在组内复制对象”。
注意:在调用此方法之前对 NetGroup.Neighbor.Connect 事件进行测试。
参数
requestID:int — 在 NetGroup.Replication.Request 事件中给定的请求标识符。
| |
object:Object — 与 NetGroup.Replication.Request 事件中给定的索引对应的对象。
|
相关 API 元素
netStatus | 事件 |
flash.events.NetStatusEvent属性 NetStatusEvent.type =
flash.events.NetStatusEvent.NET_STATUS| 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0, Flash Player 10.1 |
在 NetGroup 对象报告其状态或错误条件时调度。netStatus 事件包含一个 info 属性。info 属性是一个对象,该对象包含有关该事件的信息,例如,连接尝试成功还是失败。
netStatus 事件对象的 type 属性值。
此事件具有以下属性:
| 属性 | 值 |
|---|---|
bubbles | false |
cancelable | false;没有要取消的默认行为。 |
currentTarget | 当前正在使用某个事件侦听器处理 Event 对象的对象。 |
info | 一个对象,具有描述对象的状态或错误条件的属性。 |
target | 报告其状态的 NetConnection 或 NetStream 对象。 |
相关 API 元素
运行应用程序时,可以在文本输入字段中输入任何组名称。GroupSpecifier 类使用该名称(以及您设置的所有 GroupSpecifier 属性)来创建字符串,该字符串为该组的终身唯一名称。要将另一个客户端连接到该组,该客户端必须使用相同的组名称。例如,如果客户端 A 使用组名称“firstmesh”,要与客户端 A 通讯的其他客户端也必须使用组名称“firstmesh”。如果客户端 B 使用组名称“kite”,它将成功连接,但会创建一个新组,并将无法与“firstmesh”组中的客户端 A 或任何人进行通讯。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="100%" height="100%" applicationComplete="OnApplicationComplete()">
<mx:Script>
<![CDATA[
private var netConnection:NetConnection = null;
private var netStream:NetStream = null;
private var netGroup:NetGroup = null;
private var video:Video = null;
private var sequenceNumber:uint = 0;
private var resizeTimer:Timer = null;
private const SERVER:String = "rtmfp://fms.example.com/someapp";
[Bindable] private var connected:Boolean = false;
[Bindable] private var joinedGroup:Boolean = false;
private function OnApplicationComplete():void
{
userName.text = "user " + int(Math.random() * 65536);
groupName.text = "channel" + (int(Math.random() * 899) + 101);
resizeTimer = new Timer(2000.0);
resizeTimer.addEventListener(TimerEvent.TIMER, DoResizeVideo);
resizeTimer.start();
}
private function StatusMessage(msg:Object):void
{
statusLog.text += msg;
statusLog.verticalScrollPosition = statusLog.textHeight;
statusLog.validateNow();
}
private function NetStatusHandler(e:NetStatusEvent):void
{
StatusMessage(e.info.code);
switch(e.info.code)
{
case "NetConnection.Connect.Success":
OnConnect();
break;
case "NetConnection.Connect.Closed":
case "NetConnection.Connect.Failed":
case "NetConnection.Connect.Rejected":
case "NetConnection.Connect.AppShutdown":
case "NetConnection.Connect.InvalidApp":
OnDisconnect();
break;
case "NetStream.Connect.Success": // e.info.stream
OnNetStreamConnect();
break;
case "NetStream.Connect.Rejected": // e.info.stream
case "NetStream.Connect.Failed": // e.info.stream
DoDisconnect();
break;
case "NetGroup.Connect.Success": // e.info.group
OnNetGroupConnect();
break;
case "NetGroup.Connect.Rejected": // e.info.group
case "NetGroup.Connect.Failed": // e.info.group
DoDisconnect();
break;
case "NetGroup.Posting.Notify": // e.info.message, e.info.messageID
OnPosting(e.info.message);
break;
case "NetStream.MulticastStream.Reset":
case "NetStream.Buffer.Full":
DoResizeVideo();
break;
case "NetGroup.SendTo.Notify": // e.info.message, e.info.from, e.info.fromLocal
case "NetGroup.LocalCoverage.Notify": //
case "NetGroup.Neighbor.Connect": // e.info.neighbor
case "NetGroup.Neighbor.Disconnect": // e.info.neighbor
case "NetGroup.MulticastStream.PublishNotify": // e.info.name
case "NetGroup.MulticastStream.UnpublishNotify": // e.info.name
case "NetGroup.Replication.Fetch.SendNotify": // e.info.index
case "NetGroup.Replication.Fetch.Failed": // e.info.index
case "NetGroup.Replication.Fetch.Result": // e.info.index, e.info.object
case "NetGroup.Replication.Request": // e.info.index, e.info.requestID
default:
break;
}
}
private function DoConnect():void
{
StatusMessage("Connecting to \"" + SERVER + "\" ...\n");
netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
netConnection.connect(SERVER);
}
private function OnConnect():void
{
var groupSpecifier:GroupSpecifier;
StatusMessage("Connected\n");
connected = true;
groupSpecifier = new GroupSpecifier("max2009lab/" + groupName.text);
groupSpecifier.multicastEnabled = true;
groupSpecifier.postingEnabled = true;
groupSpecifier.serverChannelEnabled = true;
netStream = new NetStream(netConnection, groupSpecifier.groupspecWithAuthorizations());
netStream.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
netGroup = new NetGroup(netConnection, groupSpecifier.groupspecWithAuthorizations());
netGroup.addEventListener(NetStatusEvent.NET_STATUS, NetStatusHandler);
StatusMessage("Join \"" + groupSpecifier.groupspecWithAuthorizations() + "\"\n");
}
private function OnNetStreamConnect():void
{
netStream.client = this;
var mic:Microphone = Microphone.getMicrophone();
if(mic)
{
mic.codec = SoundCodec.SPEEX;
mic.setSilenceLevel(0);
netStream.attachAudio(mic);
StatusMessage("got microphone\n");
}
var camera:Camera = Camera.getCamera();
if(camera)
{
camera.setMode(320, 240, 10);
camera.setQuality(30000, 0);
camera.setKeyFrameInterval(15);
videoDisplay.attachCamera(camera);
videoDisplay.maintainAspectRatio = true;
netStream.attachCamera(camera);
StatusMessage("got camera\n");
}
netStream.publish("stream");
}
private function OnNetGroupConnect():void
{
joinedGroup = true;
}
private function DoDisconnect():void
{
if(netConnection)
netConnection.close();
videoDisplay.attachCamera(null);
}
private function OnDisconnect():void
{
StatusMessage("Disconnected\n");
netConnection = null;
netStream = null;
netGroup = null;
connected = false;
joinedGroup = false;
}
private function ClearChatText():void
{
chatText.text = "";
}
private function DoPost():void
{
var message:Object = new Object;
message.user = userName.text;
message.text = chatText.text;
message.sequence = sequenceNumber++;
message.sender = netConnection.nearID;
netGroup.post(message);
StatusMessage("==> " + chatText.text + "\n");
chatText.callLater(ClearChatText);
}
private function OnPosting(message:Object):void
{
StatusMessage("<" + message.user + "> " + message.text + "\n");
}
private function DoResizeVideo(ignored:* = null):void
{
if(video)
{
if( (0 == video.videoHeight)
|| (0 == video.videoWidth)
)
{
video.height = videoDisplay.height;
video.width = videoDisplay.width;
video.x = 0;
video.y = 0;
}
else
{
var videoAspect:Number = Number(video.videoWidth) / Number(video.videoHeight);
var displayAspect:Number = Number(videoDisplay.width) / Number(videoDisplay.height);
var adjustFactor:Number;
if(videoAspect >= displayAspect) // video is wider than display
{
adjustFactor = Number(video.videoWidth) / Number(videoDisplay.width);
video.width = videoDisplay.width;
video.height = int(Number(video.videoHeight) / adjustFactor);
video.x = 0;
video.y = int((videoDisplay.height - video.height) / 2);
}
else
{
adjustFactor = Number(video.videoHeight) / Number(videoDisplay.height);
video.height = videoDisplay.height;
video.width = int(Number(video.videoWidth) / adjustFactor);
video.x = int((videoDisplay.width - video.width) / 2);
video.y = 0;
}
}
}
}
public function onPlayStatus(info:Object):void {}
public function onMetaData(info:Object):void {}
public function onCuePoint(info:Object):void {}
public function onTextData(info:Object):void {}
public function ValidateConnectAllowed(isConnected:Boolean, groupNameText:String):Boolean
{
return (!isConnected) && (groupNameText.length > 0);
}
]]>
</mx:Script>
<mx:VBox top="10" right="10" left="10" bottom="10" verticalGap="6">
<mx:HBox width="100%">
<mx:Text text="Group:"/>
<mx:TextInput id="groupName" width="100%" text="default" enabled="{!connected}"/>
<mx:Button label="Connect" click="DoConnect()" enabled="{ValidateConnectAllowed(connected, groupName.text)}" />
<mx:Button label="Disconnect" click="DoDisconnect()" enabled="{connected}" />
</mx:HBox>
<mx:VideoDisplay id="videoDisplay" width="320" height="240" resize="DoResizeVideo()"/>
<mx:TextArea id="statusLog" width="100%" height="100%"/>
<mx:HBox width="100%">
<mx:TextInput id="userName" width="160" />
<mx:TextInput id="chatText" width="100%" enabled="{joinedGroup}" enter="DoPost()"/>
</mx:HBox>
</mx:VBox>
</mx:Application>
Tue Jun 12 2018, 11:04 AM Z
隐藏继承的公共属性
显示继承的公共属性