我正在尝试建立一个简单的P2P网络系统,以便向网络上的其他Flash播放器发送消息。
但是,当我发送消息时,接收播放器不会收到消息,而是接收到未定义的对象。
顺便提一下,我在我的病毒扫描程序(NOD 32)和我的Windows防火墙中允许使用Flash Player。
这是我的P2P课程:
package com.snakybo.as3framework.network {
import flash.events.Event;
import flash.events.NetStatusEvent;
import flash.net.GroupSpecifier;
import flash.net.NetConnection;
import flash.net.NetGroup;
/** @author Kevin */
public class P2P extends NetConnection {
private var netCon:NetConnection;
private var netGroup:NetGroup;
private var handler:Function;
private var groupName:String;
public function P2P(groupName:String, handler:Function) {
this.groupName = groupName;
this.handler = handler;
netCon = new NetConnection();
netCon.addEventListener(NetStatusEvent.NET_STATUS, conHandler);
netCon.connect("rtmfp:");
}
/** Post a message */
public function post(txt:*):void {
var data:Object = new Object();
data["txt"] = txt;
data["id"] = new Date().time;
netGroup.post(data);
}
/** Handle connection event listener */
private function conHandler(e:NetStatusEvent):void {
if(e.info["code"] == "NetConnection.Connect.Success") {
setupGroup();
}
}
/** Connect to group */
private function setupGroup():void {
var groupSpec:GroupSpecifier = new GroupSpecifier(groupName);
groupSpec.postingEnabled = true;
groupSpec.ipMulticastMemberUpdatesEnabled = true;
groupSpec.addIPMulticastAddress("225.225.0.1:30000");
netGroup = new NetGroup(netCon, groupSpec.groupspecWithAuthorizations());
netGroup.addEventListener(NetStatusEvent.NET_STATUS, handler);
dispatchEvent(new Event(Event.COMPLETE));
}
}
}
连接似乎正在起作用,因为我可以发送消息,而其他玩家确实收到了消息......好吧..收到的东西。
然后从我的Main.as我称这个类为:
private var p2p:P2P;
public function Main():void {
p2p = new P2P("snakybo", netHandler);
p2p.addEventListener(Event.COMPLETE, onConnected);
}
private function onConnected(e:Event):void {
function send(e:KeyboardEvent):void {
c.post("a");
trace("poseted");
}
stage.addEventListener(KeyboardEvent.KEY_DOWN, send);
}
private function netHandler(e:NetStatusEvent):void {
switch(e.info["code"]) {
case "NetGroup.Posting.Notify":
trace("received: " + e.info["txt"]);
break;
}
}
另外,如果我添加:
case "NetGroup.Connection.Success":
trace("Connected to group");
break;
它永远不会打印出来。不确定那是什么问题。
我在这里做错了吗?或者我的电脑以某种方式阻止了Flash Player?
答案 0 :(得分:2)
在你的P2P课程中你有这个...
netCon.connect("rtmfp:");
如果您尝试访问rtmfp连接的外部成员,这会告诉您的NetConnection连接到不是服务器或有效连接类型的字符串(“rtmfp:”)。您似乎将其用于内部网络,因此“rtmfp”将在本地运行。
我使用NetConnection.connect()做的是设置我的rtmfp常量和开发人员密钥常量(对于卷云服务器),就像这样......
cons SERVER:String = "rtmfp:";
cons DEVKEY:String = "your developer key here";
然后
function connect(): void {
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
nc.connect(SERVER + DEVKEY);
}
如果您使用他们的rtmfp服务器获取开发人员密钥,您可以访问adobes网站,无论如何他们都是免费且容易获得的。连接后,您将获得NetStatus事件字符串“NetConnection.Connect.Success”,您的conHandler函数已设置为接收。我在我的内部使用一个Switch Case来监听连接字符串并根据每个字符串做一些事情:
function netStatus(event: NetStatusEvent): void {
switch (event.info.code) {
case "NetConnection.Connect.Success":
setupGroup();
break;
} }
当您听到“NetConnection.Connect.Success”时,触发setupGroup()函数。然后在你的setupGroup()中继续并设置你的
groupspec.serverChannelEnabled = true;
groupspec.routingEnabled = true;
groupspec.objectReplicationEnabled = true; // and I have
groupspec.peerToPeerDisabled = false;
此外,在您的setupGroup中,您将触发“handler”而不是“conHandler”,这是您的NetStatus事件函数处理程序的名称。可能只是一个错字。设置新的NetGroup本身将触发3个NetStatus事件中的1个,告诉您新的网络组连接的状态,因此除非您愿意,否则不需要调度您正在使用的事件。您也可以在conHandler函数中处理它们。
我通常会有一个跟踪语句设置来打印出NetStatusEvent所以在你的情况下将是...... trace(e.info.code),你将能够看到事件的发生,并且能够更容易解决问题。一旦你建立了这个连接,你就能够处理对象的传递。
这至少应该为您创建一个已创建的实例以及与该组中其他人的连接。我在这里引用了一些链接: NetGroup NetStatus NetConnection
尝试谷歌搜索Tom Krcha,他和adobe在一起并且也有一些很好的信息。