flash java 通信_FLASH与服务器通讯 (JAVA)
1.FLASH 通過URL地址獲得服務器數據。
這種方式最為簡單,就像在瀏覽器的地址欄里面敲一樣。
先建立一個URLRequest,然后用URLLoader載入就行了。
下面這個是載入一個圖片,html頁面也用同樣方法載入。
public function Net()
{
var loader:URLLoader;
var request:URLRequest = new URLRequest("http://www.adobe.com/devnet/images/248x148/fldc_samples_3.jpg");loader = new URLLoader(request);loader.addEventListener(Event.COMPLETE,completeListener);}
function completeListener(event:Event):void
{
trace( "load completed "+loader.data+" are the data ");
}
這種方法的缺點顯而易見,大量的參數必須寫到地址里,數據被暴露而且格式轉換麻煩。
2.通過AMF協議來通訊。
AMF協議是ADOBE自己開發的一種建立在HTTP基礎上的協議。可以裝一個flash mx remoting來實現或者裝openAMF來實現,這里只討論openAMF。先下載一個openAMF,最好帶example版本的。然后把openamf.ear放到tomcat的webapps下,啟動tomcat,輸入
http://localhost:8080/openamf/gateway
假如看到空白頁,說明openAMF好用了。如何用呢?
amf的通信方式是在服務器端把java的class放到web-inf的class中,然后在flash端直接調用這個class的方法就行了。
比如helloworld這個例子。
package abc;
public class HelloServlet
{? public String hello()? {? return "this is java server!"; }? }
用javac編譯,把生成的class放到openAMF/classes/abc/
FLASH端這樣寫:
用javac編譯,把生成的class放到openAMF/classes/abc/
FLASH端這樣寫:
建立一個netconnection,然后連接那個gateway,用call的方法調用java類的方法,格式是 包名.類名.方法名。至于返回值,用responder來接收,responder在接收到數據時會調用fun函數,把返回值寫到fun函數的參數里。
3.socket方式通信
這種方法應該可以和任何語言通信,使用TCP/IP協議。但是,對于FLASH PLAYER 9及其以后的版本,比較麻煩的一點就是安全設置,
包括AMF方式在內,假如不設置會出現“安全沙箱”的錯誤。
FLASH 在連接服務器之前會發一個驗證信息:內容如下:
對應的,你也應該發回一個驗證信息,XML格式,一般可以這樣寫:
\0
注重!假如把這個串存到字符串里發回去,不要忘記那個\0,XML都是以\0結尾的。
然后FLASH會主動斷開,再執行連接,然后才算連上。
先看FLASH端代碼如何寫:
socket = new Socket();
socket.addEventListener(ProgressEvent.SOCKET_DATA,receiveData);
socket.addEventListener(Event.CONNECT,begin);
socket.connect("127.0.0.1",843);
function begin(event:Event):void
{
var s:String = "a\n";
socket.writeByte(s.charCodeAt(0));
socket.writeByte(s.charCodeAt(1));
socket.flush();
}
FLASH端比較簡單,先connect,添加CONNECT事件,假如連上了,執行begin函數,會向服務器寫兩個byte。
接收的時候用 receivedData函數,函數里面可以這么寫:
socket.readBytes(received);
readBytes是把發過來的字符數組存到received里,當然還可以用socket別的方法讀取數據。
相對于FLASH端,JAVA服務器端就比較麻煩了。
JAVA服務器這里我們用了多線程,因為可能有很多人訪問服務器。先說一下代碼思路,main函數里建立一個serversocket,然后不斷的接收請求,每收到一個請求,就建立一個進程,把對應的socket放到線程中。另外有一個sender取得所有線程socket的outputstream,實現廣播功能。
public class Main {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(843);
File x;
Thread receiver;
System.out.println("server start");
Sender sender = new Sender();
while (true)
{
Socket socket=null;
System.out.println("waiting...");
socket = ss.accept();
receiver = new Receiver(socket,sender);
System.out.println("connect from address: "+socket.getInetAddress());
receiver.start();
}
//System.out.println("server over");
}
}
這個是非主線程運行的代碼:
package for_flash_socket;
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Receiver extends Thread {
Socket socket;
final int BYTE_ARRAY_MAX_LEN = 1000;
final String FLASH_SAFE = "";
static String safe = "
policy>\0";
Sender sender;
public Receiver(Socket socket,Sender sender )
{
this.socket = socket;
this.sender = sender;
}
@Override
public void run()
{
try
{
InputStream is = socket.getInputStream();
byte [] reader = new byte [BYTE_ARRAY_MAX_LEN];
BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()));
OutputStream out = socket.getOutputStream();
sender.addOutput(out);
int ch=0;
String s;
while ( is.read(reader) != -1 )
{
//System.out.println("ch - "+ch);
s = new String(reader);
System.out.println("reader len:"+reader.length);
System.out.println(s);
if ( s!=null && s.indexOf("")>=0 )//安全策略
{
for ( int i=0;i
{
System.out.println(i+" "+(int)s.charAt(i));
}
bw.write(safe,0,safe.length());
bw.flush();
//bw.close();
System.out.println(safe);
}
else
{
synchronized(sender)
{
sender.send(s);
}
}
reader = new byte [BYTE_ARRAY_MAX_LEN];
}
bw.close();
synchronized (sender)
{
sender.removeOutput(out);
}
}
catch (Exception ex)
{
System.out.println("error in receiver");
ex.printStackTrace();
}
try
{
socket.close();
System.out.println(socket.getInetAddress()+" disconnected");
} catch (IOException ex1) {
System.out.println("socket close error");
Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex1);
}
}
}
sender:
package for_flash_socket;
import java.util.*;
import java.io.*;
public class Sender {
ArrayList outputArrayList;
public Sender()
{
outputArrayList = new ArrayList();
}
public void addOutput(OutputStream out)
{
outputArrayList.add(out);
}
public void removeOutput(OutputStream out)
{
outputArrayList.remove(out);
}
public void send(String s)
{
for (int i=0;i
{
PrintWriter pw = new PrintWriter((OutputStream)outputArrayList.get(i));
pw.write(s);
pw.flush();
}
}
}
線程那個部分代碼寫得比較搓,明白原理就行了……
這樣基本的通信功能就實現了,在接收的時候先判定一下發過來的是不是安全認證s.indexOf("")>=0
假如是返回安全認證,就是那個safe字符串。
否則把發過來的信息廣播出去。sender.send方法。
要注重的是:
while ( is.read(reader) != -1 )這一行
我一開始用的是BufferedReader readLine()方法讀取的。總是莫名奇妙的出錯,所以建議不要用BufferedReader,直接讀取byte或者byte數組的方式比較好。再把byte[]轉成string判定是否是FLASH發過來的安全認證。
假如出現安全沙箱錯誤,一般是安全認證沒有返回,但是別的情況也有可能出現這個錯誤,比如服務器的socket關閉早了,或者服務器沒有把socket流內的內容讀取完畢就關閉了,都會導致這個錯誤。
所以socket讀到不能再讀,然后再關閉,這個地方需要注重。
還有一個用XMLSocket的方式通信的,和socket差不多,這里不多說了,安全認證也是一樣的,比socket簡單一些。
這樣,就完成了基本的 FLASH與JAVA 通信。
總結
以上是生活随笔為你收集整理的flash java 通信_FLASH与服务器通讯 (JAVA)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: extmail mysql数据库 重启_
- 下一篇: 在线教育开源 java_开源项目Spri