Socket(通訊端技術)是一種簡單而易學的技術,尤其在當前像Java這樣面向網路,面向商業開發的語言的支援下,實現起來是相當方便的。
Flash大家都知道,在網狀圖像,動畫的傳輸上有著獨天得厚的優厚優勢,Flash player及其外掛程式的高普及率。再加上一個十分強大的OO型的指令碼AS2,以及它的失量圖形系統,swf跨平台等優點。在短期內恐怕難有對手可以與之抗衡,而且有發展的越來越好的趨勢。
但是,Flash的功能畢竟還是有極限的。比如,隨意的讀寫檔案等基本的應用程式應有的功能都無法實現。在應對大規模的資料輸入的時候,用Flash比較“偏”的資料庫存取系統無論是開發效率和運行效率都難以有保證。
而現在主流的商業化,網路化的OO技術,如JAVA等,在處理後台資料要事物方面可是拿手絕活。所以,如果能利用Java等主語言寫的程式來處理資料,通過資料間的傳遞補,讓Flash在前能做一個展示級的平台的功能,一定可以讓你開發出前所未有的,無論在外還是在內都堪稱一流的直接面向網路的軟體。
今天我做的嘗試有些人也已做過了,不過我這裡是拿自己嘗試的體驗與大家一起來分享一下:
1.首先要知道一件事,就是能不能做的問題的,Java自不必說了。Flash方面,主要是有一個XmlSocket類,可以用來與建成伺服器的應用軟體通訊.通訊的形式有兩面種,一種是用xml節點資訊,比如說這樣:
<xmlNode attribute1=”helloWorld” />
在xml技術被廣泛應用的今天,這種格式更有生命力,xml在j2ee層級的應用裡可以經常看到.
還有一種是相對簡單的,直接傳字串.在小規模的程式裡會比較實用.
當然啦,說到底傳的都是位元組流.
在用以上兩種方式傳輸的時候,請不要忘了,在Flash和Java端,都要加上位元組流的終止符:
Flash傳給Java程式做的伺服器端的資訊,未尾加”\n”.
Java程式做的伺服器端傳達室給Flash的資訊,未尾加”\0”.
2傳完資料了,接下來就是解析了,在兩端都可以直接應用各自的字串Api進行方便的處理。這裡就不細談了。
下面簡單介紹一下我做的一個小Demo,通過Java發資料給Flash讓Flash中的一個小球從左向右移動:
import java.io.*;
import java.net.*;
public class mainServer
{
public static boolean sFlag;
public static void main(String args[])
{
try
{
ServerSocket server=null;
try
{
server=new ServerSocket(4700);
}
catch(Exception e)
{
System.out.println("can not listen to :"+e);
}
Socket socket=null;
try
{
System.out.println("Java Server Start:");
socket=server.accept();
System.out.println("client has connected\n");
}
catch(Exception e)
{
System.out.println("Error:"+e);
}
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));//*correct get the input from the client
PrintWriter os=new PrintWriter(socket.getOutputStream()); /*correct make os the output to client*/
sFlag=true;
controlThread testController=new controlThread(os);
testController.start();//啟動控制線程.
while(sFlag)
{ ;
}
System.out.println("server ends successfully!\n");
is.close();
socket.close();
server.close();
}
catch(Exception e)
{
System.out.println("Error:"+e);
}
}
}
主程式相當簡單,建立Socket服務端,並啟動一個管理線程,那好,下面就來看這個管理線程:
import java.io.*;
public class controlThread extends Thread
{
private Point controlNode;
private PrintWriter outputStream;
public controlThread(PrintWriter inOutputStream)
{
outputStream=inOutputStream;//得到要寫回的資料的對象,這裡是flash用戶端.
}
public void run()
{
controlNode=new Point(180,150);
for(int i=0;i<100;i++)
{
try
{
sleep(400);
}
catch(java.lang.InterruptedException e)
{
System.out.println(e);
}
controlNode.mx=180+i*2;
outputStream.println(controlNode.toString()+"\0");
outputStream.flush();
System.out.println(controlNode.toString());
}
mainServer.sFlag=false;
}
}
通來改變一個點結點的資訊,傳給Flash中的對象,用sleep函數來達到一定的延時作用,達到控制Flash對象的功能.
結點類夠簡單:
class Point
{
public int mx;
public int my;
public Point(int inX,int inY)
{
mx=inX;
my=inY;
}
public String toString()
{
return new String(mx+","+my);
}
}
下面轉到Flash:
主要經曆以下工作:
1) 建立串連
2) 接收傳達回的訊息,並來情境上響應的動畫,改變對象的座標值.
相當輕鬆的工作,不是嗎?
1.建立串連:
function mainF():Void
{
if(_root.DEBUG)
createDebugMc();
var serverAddress:String="127.0.0.1";
var port:Number=4700;
_root.gSocket=new XMLSocket();
_root.gSocket.onConnect=myOnConnect;
_root.gSocket.onData=myOnData;
if(!_root.gSocket.connect(serverAddress,port))
{
trace3("Connection failure!");
}
}
2接收傳達回的訊息,並來情境上響應的動畫,改變對象的座標值.在一個onData函數中實現:
function myOnData(str:String):Void
{
trace3(str);
var arr:Array=str.split(",");
var tmpX:Number=Number(arr[0]);
var tmpY:Number=Number(arr[1]);
_root.ball._x=tmpX;
_root.ball._y=tmpY;
}
好了,就介紹這些,附上源碼:
java_flash1.rar
java_flash2.rar
//如果上面這個連結無法響應下載(有可能是被網站給屏蔽掉了),則可使用下載工具(如迅雷等)下載。
歡迎提出批評與指正意見!