Search code examples
actionscript-3airudpflash-cs6datagram

UDP Datagram socket not going through and giving null error


I have a UDP socket program in Action Script 3 with Adobe Air compiled in flash CS6 and I keep receiving an error

TypeError: Error #1009: Cannot access a property or method of a null object reference. at Untitled_fla::MainTimeline/fl_MouseClickHandler()[Untitled_fla.MainTimeline::frame1:64]

here is my code:

import flash.display.Sprite; 
import flash.events.DatagramSocketDataEvent; 
import flash.events.Event; 
import flash.net.DatagramSocket; 
import flash.utils.ByteArray; 

var datagramSocket:DatagramSocket; 

//The IP and port for this computer 
var localIP:String = iploc.text; 
var localPort:int = portloc.value; 

//The IP and port for the target computer 
var targetIP:String = ipto.text; 
var targetPort:int = portto.value; 

function DatagramSocketExample() 
{ 
    //Create the socket 
    datagramSocket = new DatagramSocket(); 
    datagramSocket.addEventListener( DatagramSocketDataEvent.DATA, dataReceived ); 

    //Bind the socket to the local network interface and port 
    datagramSocket.bind( localPort, localIP ); 

    //Listen for incoming datagrams 
    datagramSocket.receive(); 

    //Create a message in a ByteArray 

} 

function dataReceived( event:DatagramSocketDataEvent ):void 
{ 
    //Read the data from the datagram 
    trace("Received from " + event.srcAddress + ":" + event.srcPort + "> " + 
        event.data.readUTFBytes( event.data.bytesAvailable ) );
        rcv.text = event.data.readUTFBytes( event.data.bytesAvailable )
} 



sendbtn.addEventListener(MouseEvent.CLICK, fl_MouseClickHandler);

function fl_MouseClickHandler(event:MouseEvent):void
{
var data:ByteArray = new ByteArray(); 
    data.writeUTFBytes(msg.text); 

    //Send the datagram message 
    datagramSocket.send( data, 0, 0, targetIP, targetPort); 

}

Please help me.


Solution

  • why? - because you haven't called the DatagramSocketExample() function. so it didn't setup the addEventListener() and bind() here is some stripped down test code that works. binds to localhost 127.0.0.1 and the same port so you can see it receiving the data through the dataReceived() event function.

    import flash.display.Sprite;
    import flash.events.DatagramSocketDataEvent;
    import flash.events.Event;
    import flash.net.DatagramSocket;
    import flash.utils.ByteArray;
    
    var datagramSocket: DatagramSocket;
    var localIP: String = "127.0.0.1";
    var localPort: int = 1;
    var targetIP: String = "127.0.0.1";
    var targetPort: int = 1;
    
    datagramSocket = new DatagramSocket();
    datagramSocket.addEventListener(DatagramSocketDataEvent.DATA, dataReceived);
    datagramSocket.bind(localPort, localIP);
    datagramSocket.receive();
    
    var data: ByteArray = new ByteArray();
    data.writeUTFBytes("Test data");
    datagramSocket.send(data, 0, 0, targetIP, targetPort);
    
    function dataReceived(event: DatagramSocketDataEvent): void {
        trace("Received from " + event.srcAddress + ":" + event.srcPort + "> " + event.data.readUTFBytes(event.data.bytesAvailable));
    }