日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flash java 通信_FLASH与服务器通讯 (JAVA)

發布時間:2025/3/19 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。