I was just wondering if there was any reason this wasn't working. Basically I'm writing an application (let's call it a game so I can keep this thread here because it probably would be useful for games too) and I originally wanted to use FSCommand to launch video files. Unfortunately, until AIR 2.0 this is impossible and you need an external process running so, knowing java can launch files, I decided to write a simple socket server to pass the file path to and have Java execute it for me. Here's the AppSocket class:
And here is my single file Java socket server:Code:package com.hsg.util { import flash.display.Sprite; import flash.events.*; import flash.net.XMLSocket; public class AppSocket extends Sprite { private var hostName:String = "localhost"; private var port:uint = 8080; private var socket:XMLSocket; private var sendData:String; public function AppSocket(data:String) { sendData = data; socket = new XMLSocket(); configureListeners(socket); socket.connect(hostName, port); } public function send():void { socket.send(sendData); } private function configureListeners(dispatcher:IEventDispatcher):void { dispatcher.addEventListener(Event.CLOSE, closeHandler); dispatcher.addEventListener(Event.CONNECT, connectHandler); dispatcher.addEventListener(DataEvent.DATA, dataHandler); dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler); dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); } private function closeHandler(event:Event):void { trace("closeHandler: " + event); } private function connectHandler(event:Event):void { trace("connectHandler: " + event); } private function dataHandler(event:DataEvent):void { trace("dataHandler: " + event); } private function ioErrorHandler(event:IOErrorEvent):void { trace("ioErrorHandler: " + event); } private function progressHandler(event:ProgressEvent):void { trace("progressHandler loaded:" + event.bytesLoaded + " total: " + event.bytesTotal); } private function securityErrorHandler(event:SecurityErrorEvent):void { trace("securityErrorHandler: " + event); } } }
And here's how I call it:Code:import java.io.*; import java.net.*; public class simpleServer { public static void main(String args[]) { // Message terminator char EOF = (char)0x00; try { // create a serverSocket connection on port 9999 ServerSocket s = new ServerSocket(8080); System.out.println("Server started. Waiting for connections..."); // wait for incoming connections Socket incoming = s.accept(); BufferedReader data_in = new BufferedReader( new InputStreamReader(incoming.getInputStream())); PrintWriter data_out = new PrintWriter(incoming.getOutputStream()); data_out.println("Welcome! type EXIT to quit." + EOF); data_out.flush(); boolean quit = false; // Waits for the EXIT command while (!quit) { String msg = data_in.readLine(); try { System.out.println("Executing: " + msg); Process p = Runtime.getRuntime().exec(msg); } catch (Exception err) { System.out.println("Error."); } if (msg == null) quit = true; if (!msg.trim().equals("EXIT")) { data_out.println("You sayed: <b>"+msg.trim()+"</b>"+EOF); data_out.flush(); } else { quit = true; } } } catch (Exception e) { System.out.println("Connection lost"); } } }
Now, it will show the path in java, but my problem is that it takes something like 10-30 seconds for Java to finally display the message it received. Is there a way to speed this up? Also, it's failing to execute the file. Flash does receive the message "Welcome! Type EXIT to quit.". It will trace out the path I give (i.e C:\Users\Public\Videos\vid.avi) but it never executes. After it displays the path it immediately terminates the java program. Output:Code:private function launchFile(path:String) { var sock:AppSocket = new AppSocket(path); sock.addEventListener(Event.CONNECT, blah); } private function blah(de:DataEvent) { trace("TEST DATA BEING SENT"); de.target.send("TEST DATA"); }
If anyone could figure what I'm doing wrong here, I'd much appreciate it. This app is so far behind schedule it's not even funny because I didn't realize they changed FSCommand capability in AS3/AIR.Code:Server started. Waiting for connections... Executing: C:\Users\Public\Videos\vid.aviError. java.lang.NullPointerException Connection lost Process completed.
I am working with Adobe CS4 Professional, AIR 1.5, AS3, on Windows 7.





Reply With Quote