Search code examples
actionscript-3flashflash-cs5.5localconnection

AS3 - LocalConnection Doesn't Seem to Work


I'm trying to set up communication between three swfs loaded into separate broswer windows (all opened by the initially opened page) using LocalConnection. I'm new to inter-swf communication, and am going by the tutorial found here.

I'm running these from a xampp server for testing.

Essentially, I have 3 swfs. I have one 'master' swf, and two 'slave' swfs. When the master swf is launched, it opens both other swfs in new windows. When a button is clicked in the master, I'm trying to just update some text in one of the slaves. More complicated stuff will happen later, I'm just trying to figure out LocalConnections first.

The code (on the timeline) in 'master.swf':

import flash.net.URLRequest;
import flash.events.Event;

//Used as a flag to open each slave window, one of the first frame, one on the second frame, as using navigateToURL twice in a row doesn't seem to work.
var frameCount = 0;

//This is what I'm attempting to send over the LocalConnection.
var messageText = "it worked!";

var slave1url:URLRequest = new URLRequest("slave1.html");
var slave2url:URLRequest = new URLRequest("slave2.html");

//Creates a one-way connection to communicate with JUST slave1
var slave1OutboundConnection:LocalConnection = new LocalConnection();

this.addEventListener(Event.ENTER_FRAME, Update);

slave1Button.addEventListener(MouseEvent.CLICK, SendMessageToSlave1);
slave1Button.buttonMode = true;

//Send a message to slave1 via the slave1OutboundConnection
function SendMessageToSlave1(e:Event){  
    slave1OutboundConnection.send("masterToSlave1Connection", "UpdateTextFromCommunication", messageText);  
}

function Update(e:Event){

    //Open the slave1 page on the first frame, and the slave2 page on the second frame.
    if(frameCount == 0){
        navigateToURL(slave1url, "_blank");
        frameCount++;
    } else if (frameCount == 1){
        navigateToURL(slave2url, "_blank"); 
        frameCount++;
    }   

}

In slave1:

var masterInboundConnection:LocalConnection = new LocalConnection();

masterInboundConnection.allowDomain("*");

masterInboundConnection.connect("masterToSlave1Connection");

function UpdateTextFromCommunication(receivedArguments){
   displayText.text = receivedArguments;
}

I've also got a little bit of custom javascript in each html page to set page size and position, but I don't think that should matter:

<script>
        //Get the width of the user's monitor
        var resolutionWidth = window.screen.availWidth;

        //Get the height of the user's monitor (minus the height of the task bar)
        var resolutionHeight = window.screen.availHeight;   

        //First screen is 0, second is 1, third is 2, etc.
        var screenNumber = 2;

        //If this screen is not displayed on the primary monitor, add 40 pixels for the lack of the taskbar on other monitors
        if(screenNumber > 0){
            resolutionHeight += 40;
        }

        //Maximize the window
        this.resizeTo(resolutionWidth, resolutionHeight);

        //Move the window to the appropriate display
        this.moveTo(resolutionWidth * screenNumber, 0);         
    </script>

When I click the button that's supposed to trigger the communication, nothing appears to happen.

I'm running the html pages containing these swfs in IE11 on a localhost xampp server on Windows 7. Swfs made in CS5.5.


Solution

  • In each of the inbound connections, I was missing a single line of code:

    masterInboundConnection.client = this;
    

    Now everything is working as expected.