0

我正在尝试制作一个简单的 P2P 网络系统来向您网络上的其他 Flash Player 发送消息。

但是,当我发送消息时,接收玩家不会收到消息,而是收到未定义的对象。

顺便说一句,我确实在我的病毒扫描程序(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?

4

1 回答 1

2

在您的 P2P 课程中,您有这个...

netCon.connect("rtmfp:");

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

我对 NetConnection.connect() 所做的就是像这样立即设置我的 rtmfp 常量和开发人员密钥常量(用于 cirrus 服务器)......

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 网站,无论如何它们都是免费且容易获得的。连接后,您将获得一个“NetConnection.Connect.Success”的 NetStatus 事件字符串,您的 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 中,您正在触发“处理程序”而不是“conHandler”,这是您的 NetStatus 事件函数处理程序的名称。可能只是一个错字。设置新的 NetGroup 本身将触发 3 个 NetStatus 事件中的 1 个,告诉您新的网络组连接的状态,因此除非您愿意,否则您无需分派正在使用的事件,由您决定。你也可以在你的 conHandler 函数中处理它们。

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

这至少应该为您提供一个创建的实例以及与组中其他人的连接。我在这里引用了几个链接: NetGroup NetStatus NetConnection

尝试使用谷歌搜索 Tom Krcha,他使用 adobe,并且对此也有一些很好的信息。

于 2013-12-09T04:44:48.353 回答