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)相关推荐

  1. Android之用java的socket写服务器提示java.net.BindException: Address already in use

    1 问题 在Android activity里面Java socket服务器,然后关闭activity再打开activity开启服务的时候提示错误如下 java.net.BindException: ...

  2. Java通信之服务器生猛上手

    Java通信之服务器生猛上手 一.生猛上手前的准备 Java其实是一门网络编程语言,这是和C语言和C++语言的一大区别,同时也是Java语言的一大特性:通过简单的Java语言代码就可以让多台计算机之间 ...

  3. java 和 flash socket通信封装

    java我用了java.nio,没有用nettiy,mina等框架,因为这些框架让我看起来更难理解原理. 偶封装的只是用来玩滴,没有经过实际项目的磨练,还需要不断润色和加工的, 后续需要研究的:传输对 ...

  4. C++服务器与java进行socket通信案例

    注:本代码版权所有!!!转载时请声明源地址:http://blog.csdn.net/nuptboyzhb/article/details/8047619 你可以学习,分享,修改,教学等.但是不得用于 ...

  5. JAVA通信(二)——实现客户机和服务器通信

    前面一篇博客我们简单地理清了JAVA创建服务器,以及客户机连接服务器的流程,今天我们继续往下学习,实现客户机和服务器的通信.由于基本概念我们已经在前一篇博客说清楚了,这里我们就不再进行赘述.(不清楚的 ...

  6. Int类型数据的序列化以及反序列化(与Java服务器通讯预热)

    游戏前端,避免不了的跟服务器通讯,其实游戏的大部分逻辑都在服务端,并不在客户端,所以需要跟服务端通讯"协商"一些逻辑,既然通讯,就少不了的传输,传输之前又要序列化,这篇博客主要讲一 ...

  7. java 网页通讯_Vue+Java 通过websocket实现服务器与客户端双向通信操作

    1. vue代码 methods: { //在方法里调用 this.websocketsend()发送数据给服务器 onConfirm () { //需要传输的数据 let data = { code ...

  8. qt与JAVA服务器通信_Qt实现的SSL通信客户端和服务器

    [实例简介] Qt实现的SSL通信客户端和服务器 使用QSslSocket实现加密通信 [实例截图] [核心代码] f3a25e44-604e-4435-9e05-3f6efe57c6b0 └── s ...

  9. Flex与Java通信之HttpService方式

    2019独角兽企业重金招聘Python工程师标准>>> Flex用RemoteObject方式与Java通信是最常用的方式,这是一种最直观的方式.当然Flex也可以用HttpServ ...

最新文章

  1. 干货 | 非常全面的谱聚类算法原理总结
  2. 如何实现一个跨库连表SQL生成器?
  3. oracle误删数据的解决方法
  4. 如何设置显示内容而不是显示对象
  5. 并查集——集合(洛谷 P1621)
  6. app开发第二次总结
  7. javaweb各种乱码问题处理
  8. ubuntu安装composer
  9. Laravel.com 中国镜像、中文站点
  10. Atitit.自定义jdbc驱动  支持jsql
  11. 如何在没有原工程的情况下,利用vivado将bit文件转化成bin文件
  12. 9106w android7,三星note4 SM-N9106W原厂刷机包4.4.4/5.0.1rom线刷包Root驱动
  13. Python3 读取word中的表格,根据表格第一行标题行查找想要的表格
  14. CUDA error: invalid device ordinal
  15. 信息安全工具汇总整理
  16. Vue项目中使用Tinymce
  17. 你知道不注册国外邮箱也能往国外发邮件吗?
  18. 已知函数和y值求自变量用matlab,matlab已知函数值求自变量,求助
  19. Ubuntu 18.04 LTS安装后要做的11件事情
  20. 类office2007工具栏

热门文章

  1. 无法读取源文件或磁盘_禁用格式化磁盘操作 保护电脑文件安全防止删除
  2. 对象检测目标小用什么模型好_[目标检测] YOLO4论文中文版
  3. Python基础教程:赋值语句和布尔值
  4. Python 文件writelines() 方法和处理双层列表
  5. Python 中函数(function)的用法
  6. python:直接插入和简单选择排序
  7. 怎样使一排文字中间有间隔_超级间隔条在中空玻璃中的应用
  8. 修改labelImg软件的yolo标注写入格式(.txt文件不换行的解决办法)(将换行符'\n'替换成'\r\n')
  9. tensorflow教程 开发者指南——评估器 estimator(tensorflow官方推荐使用的编程API)
  10. asp简单样例(1)