基于Socket实现Flex与Java通信(一)

2014-11-24 00:57:37 · 作者: · 浏览: 0

将Flex中的信息通过Socket,由Java来接受并进行处理可以大大的降低Flex的前台的处理,这是我最近一周来做的事,被这些小事给缠住了,可这些小问题又不得不解决,对于我这个初学者来说还是比较辛苦的,当然对于牛人来说这就是小儿科了,就当看笑话吧,对于新手或有这方面需求的人来说,可以借鉴一下。下面入正题:
我所实现的是在Flex前台中对Camera或播放的视频流进行截图,将其转换为二进制流,通过Socket,将二进制流发送给后台的Java,实现对图片的保存,起初我也觉得挺简单的,不想一做就做了老长的时间,真是特郁闷
1.Flex实现截图的功能

这个问题比较简单,所用到的类有:

public class BitmapData :想了很多方法,这个类都用上了(可能我思维局限吧,!)

public class ByteArray :将图象数据转换为字节流,此类也必不可少

使用以上两类完全可以实现对视频流的截图以及转换,不过Flex还提供了一个类可以实再这样的功能:

public dynamic class ImageSnapshot :看名字就知道是实现什么的了

以上的几个类说明及用法在 ActionScript 3.0 Language and Components Reference 这种参考文档里都可以找到,这里就不介绍了。我这的需求当中只需截图转换即可不需要第三个类来掺和。部分代码如下:

1 var byteArray:ByteArray=new ByteArray();
2 var bitmap:BitmapData=new BitmapData(vd.width,vd.height);
3 bitmap.draw(vd);
4 byteArray.writeInt(bitmap.width);
5 byteArray.writeInt(bitmap.height);
6 var byteArrayTemp:ByteArray=bitmap.getPixels(bitmap.rect);
7 byteArray.writeBytes(byteArrayTemp);

其中vd是要截取的视频流,代码已经很清楚了,就不写过多的费话了。这一部分结束;

2.Flex中Socket的实现
Socket 类使代码可以建立套接字连接并读取和写入原始二进制数据。这里所做的只是对主机地址及端口号进行设置,并对其进行监听,连接成功就可以发送数据了,这个的实再也是相当的简单,网上的资料也非常的多,具体的实再并不难找,在这就不过多的说了,跳过此节;
3.Java中的实现
在Java中所要做的事有:建立服务(设置端口号),接收数据,并对数据进行处理(生成相应的格式,在这里我只生成JPG的,其它道理相同)
这里做一下简要的介绍:
第一个介绍的当然是服务的建立:java.net.ServerSocket

1 import java.net.ServerSocket
2 private static ServerSocket server;
3 server = new ServerSocket(1024);
声明服务 ,设置端口号,要注意端口号必需大于等于1024,小于1024的都名花有主了,
第二个要做的就是监听了,也就是接收前台发送过来的数据,也可以将Flex前台理解为客户端,Java这边建立服务,可以称为服务器端,这样更易理解些。使用ServerSocket类的一个方法 accept,此方法在未接收到数据时是阻塞的:

1 import java.net.Socket;
2 private Socket socket;
3 socket = server.accept();

但要记住,此方法会抛出异常
第三件事就是接收数据,并进行处理了,也就是在这里,可以是理解的不到位,绕了不小的弯子,不过最终还是绕回来了:
在这是我要接收的的二进制流,数据基本都是二制的,所以要用到 :DataInputStream,让它来获取socket对象的输入流,相应的DataOutputStream获取socket对象的输出流来完成对客户端的响应,代码如下:
1import java.awt.Image;
2import java.awt.Toolkit;
3import java.awt.image.BufferedImage;
4import java.awt.image.MemoryImageSource;
5import java.io.DataInputStream;
6import java.io.DataOutputStream;
7import java.io.File;
8import java.io.FileOutputStream;
9import java.io.DataInputStream;
10import javax.imageio.ImageIO;

11try {
12 System.out.println("传输开始:");
13 file = new File("C:\images\image" + sum + ".jpg");
14 sum++;
15 DataInputStream dis = new DataInputStream(socket.getInputStream());
16 DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
17
18 FileOutputStream out = new FileOutputStream(file);
19 int width = dis.readInt();
20 int height = dis.readInt();
21 System.out.println("width:" + width+"--> height:"+height);
22 byte[] buffer1 = new byte[MAX_COUNT];
23 int size=width*4*height;
24 byte[] buffer=new byte[size];
25 int count=0,num=0;
26 while(true){
27 count=dis.read(buffer1,0,MAX_COUNT);
28 System.arraycopy(buffer1, 0, buffer, num, count);
29 num