将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=newByteArray();2 var bitmap:BitmapData=newBitmapData(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.ServerSocket2 privatestaticServerSocket server;3 server=newServerSocket(1024);
声明服务 ,设置端口号,要注意端口号必需大于等于1024,小于1024的都名花有主了,
第二个要做的就是监听了,也就是接收前台发送过来的数据,也可以将Flex前台理解为客户端,Java这边建立服务,可以称为服务器端,这样更易理解些。使用ServerSocket类的一个方法 accept,此方法在未接收到数据时是阻塞的:
1 importjava.net.Socket;2 privateSocket socket;3 socket=server.accept();
但要记住,此方法会抛出异常
第三件事就是接收数据,并进行处理了,也就是在这里,可以是理解的不到位,绕了不小的弯子,不过最终还是绕回来了:
在这是我要接收的的二进制流,数据基本都是二制的,所以要用到 :DataInputStream,让它来获取socket对象的输入流,相应的DataOutputStream获取socket对象的输出流来完成对客户端的响应,代码如下:
1
importjava.awt.Image;2
importjava.awt.Toolkit;3
importjava.awt.image.BufferedImage;4
importjava.awt.image.MemoryImageSource;5
importjava.io.DataInputStream;6
importjava.io.DataOutputStream;7
importjava.io.File;8
importjava.io.FileOutputStream;9
importjava.io.DataInputStream;10
importjavax.imageio.ImageIO;11
try{12
System.out.println("传输开始:");13
file=newFile("C:\\images\\image"+sum+".jpg");14
sum++;15
DataInputStream dis=newDataInputStream(socket.getInputStream());16
DataOutputStream dos=newDataOutputStream(socket.getOutputStream());17
18
FileOutputStream out=newFileOutputStream(file);19
intwidth=dis.readInt();20
intheight=dis.readInt();21
System.out.println("width:"+width+"--> height:"+height);22
byte[] buffer1=newbyte[MAX_COUNT];23
intsize=width*4*height;24
byte[] buffer=newbyte[size];25
intcount=0,num=0;26
while(true){27
count=dis.read(buffer1,0,MAX_COUNT);28
System.arraycopy(buffer1,0, buffer, num, count);29
num+=count;30
System.out.println("length:"+num+"-->"+count);31
if(num==size){32
Image TheImage=readImage32(buffer, height, width);33
BufferedImage tag=newBufferedImage(width, height,34
BufferedImage.TYPE_INT_RGB);35
tag.getGraphics().drawImage(TheImage,0,0, width, height,null);36
System.out.println(file.getName());37
//JPEGImageEncoder jpegImage = JPEGCodec.createJPEGEncoder(out);38
//jpegImage.encode(tag);39
ImageIO.write(tag,"JPEG", out);40
System.out.println("传输完成:");41
out.close();42
dis.close();43
}45
}46
47
}catch(Exception e){48
e.printStackTrace();49
} 上面就是接收数据处理的大部分代码,就不做解释了,其中的readImage32是对接收过来的二进制数据进行转换得到图片各像素点的值,具体代码就不贴了。
主要考滤到Flex在处理图片上进行格式的转换相当的慢,到无法忍受的地步,所以采用后台Java来处理,从实验的结果上看对前台不怎么影响,在一定程度上得到改善,希望有这方面经验的人多指点,提出宝贵的意见,
这是我第一次写Blog,请多多支持
posted on 2011-05-19 10:53 The Conqueror 阅读(2405) 评论(2) 编辑 收藏