Actionscript 3 AS3-仅接收本地P2P网络;“未定义”;数据

Actionscript 3 AS3-仅接收本地P2P网络;“未定义”;数据,actionscript-3,networking,p2p,Actionscript 3,Networking,P2p,我正在尝试制作一个简单的P2P网络系统,向网络上的其他Flash播放器发送消息 但是,当我发送一条消息时,接收的播放器不会收到消息,而是收到一个未定义的对象 顺便说一句,我的病毒扫描程序(NOD32)和Windows防火墙都允许使用Flash Player 这是我的P2P课程: package com.snakybo.as3framework.network { import flash.events.Event; import flash.events.NetStatusEve

我正在尝试制作一个简单的P2P网络系统,向网络上的其他Flash播放器发送消息

但是,当我发送一条消息时,接收的播放器不会收到消息,而是收到一个未定义的对象

顺便说一句,我的病毒扫描程序(NOD32)和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));
        }
    }
}
连接似乎正在工作,因为我可以发送消息,而另一个玩家确实收到了消息。。好。。收到一些东西

然后从我的主课开始,我这样称呼这个课:

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;
    }
}
function netStatus(event: NetStatusEvent): void {
    switch (event.info.code) {
          case "NetConnection.Connect.Success":
        setupGroup();
        break;
} }
此外,如果我加上:

case "NetGroup.Connection.Success":
    trace("Connected to group");
    break;
它从不打印那个。我不知道这有什么问题


我做错什么了吗?还是我的电脑不知何故阻止了Flash Player?

在你的P2P课程中,你有这个

netCon.connect("rtmfp:");
这会告诉您的NetConnection连接到一个字符串(“rtmfp:”),如果您试图访问rtmfp连接的外部成员,该字符串不是服务器或有效的连接类型。看起来您正在将其用于内部网络,因此“rtmfp”将在本地工作

我使用NetConnection.connect()所做的是,我立即设置rtmfp常量和开发人员密钥常量(对于cirrus服务器),如下所示

cons SERVER:String = "rtmfp:";
cons DEVKEY:String = "your developer key here";
然后

如果您正在使用adobes的rtmfp服务器获取开发人员密钥,您可以访问adobes网站,这些密钥是免费的,而且很容易获取。一旦连接,您将获得一个NetStatus事件字符串“NetConnection.Connect.Success”,您的conHandler函数将设置为接收该字符串。我使用我的开关盒来监听连接字符串,并根据每个字符串执行如下操作:

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;
    }
}
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事件函数处理程序的名称。可能只是打字错误。设置新网络组本身将触发3个NetStatus事件中的1个,告诉您新网络组连接的状态,因此您无需调度正在使用的事件,除非您愿意,由您决定。您也可以在conHandler函数中处理这些问题

我通常会有一个跟踪语句设置来打印出NetStatusEvent,所以在您的情况下,这将是。。。跟踪(e.info.code),您将能够在事件发生时看到事件,并且能够更轻松地解决问题。一旦建立了此连接,就可以处理对象的传递

这至少可以为您创建一个实例,并与组中的其他人建立连接。我在这里引用了几个链接:


试着用谷歌搜索Tom Krcha,他是adobe的员工,在这方面也有一些很好的信息。

谢谢你的信息@E10“groupSpec.addIPMulticastAddress(“225.225.0.1:30000”);“你还需要所有这些吗?刚刚测试过,它可以工作这正是我想要的..serverChannelEnabled等。谢谢!如果您有特定的服务器发送数据,或者您有防火墙过滤UDP流量,那么您只需要这样做。谢谢,我不确定,但我添加了所有建议-serverChannelEnabled、objectReplicationEnabled、PeerTopeerSabled,现在它的功能已经具备“routingEnabled”功能,我们将更详细地研究这些参数。谢谢如果我们的条款一致,我相信活动组的数量就是您设置的组说明符的数量。您可以创建新的组来处理单独的实例,例如聊天室。您可以让客户机在成功连接到组或签出NetStatusEvent后为该组激发唯一密钥。这里有很多活动,有助于了解谁在参加会议。希望有帮助。