包 | 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