java flex socket_基于Socket实现Flex与Java通信

将Flex中的信息通过Socket,由Java来接受并进行处理可以大大的降低Flex的前台的处理,这是我最近一周来做的事,被这些小事给缠住了,可这些小问题又不得不解决,对于我这个初学者来说还是比较辛苦的,当然对于牛人来说这就是小儿科了,就当看笑话吧,对于新手或有这方面需求的人来说,可以借鉴一下。下面入正题:

我所实现的是在Flex前台中对Camera或播放的视频流进行截图,将其转换为二进制流,通过Socket,将二进制流发送给后台的Java,实现对图片的保存,起初我也觉得挺简单的,不想一做就做了老长的时间,真是特郁闷

1.Flex实现截图的功能

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

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

2be4f2c3398ac89177181180f2f5e68f.gif!)

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的都名花有主了,

5a2bf38991631479663b196a77988b9c.gif

第二个要做的就是监听了,也就是接收前台发送过来的数据,也可以将Flex前台理解为客户端,Java这边建立服务,可以称为服务器端,这样更易理解些。使用ServerSocket类的一个方法 accept,此方法在未接收到数据时是阻塞的:

1 importjava.net.Socket;2 privateSocket socket;3  socket=server.accept();

但要记住,此方法会抛出异常

f5ae1d4247fd95e41db5cef4bd72e120.gif  

第三件事就是接收数据,并进行处理了,也就是在这里,可以是理解的不到位,绕了不小的弯子,不过最终还是绕回来了:

在这是我要接收的的二进制流,数据基本都是二制的,所以要用到 :DataInputStream,让它来获取socket对象的输入流,相应的DataOutputStream获取socket对象的输出流来完成对客户端的响应,代码如下:

1

4f1150b881333f12a311ae9ef34da474.pngimportjava.awt.Image;24f1150b881333f12a311ae9ef34da474.pngimportjava.awt.Toolkit;34f1150b881333f12a311ae9ef34da474.pngimportjava.awt.image.BufferedImage;44f1150b881333f12a311ae9ef34da474.pngimportjava.awt.image.MemoryImageSource;54f1150b881333f12a311ae9ef34da474.pngimportjava.io.DataInputStream;64f1150b881333f12a311ae9ef34da474.pngimportjava.io.DataOutputStream;74f1150b881333f12a311ae9ef34da474.pngimportjava.io.File;84f1150b881333f12a311ae9ef34da474.pngimportjava.io.FileOutputStream;94f1150b881333f12a311ae9ef34da474.pngimportjava.io.DataInputStream;104f1150b881333f12a311ae9ef34da474.pngimportjavax.imageio.ImageIO;111fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.giftry{12d18c02628675d0a2c816449d98bda930.png            System.out.println("传输开始:");13d18c02628675d0a2c816449d98bda930.png            file=newFile("C:\\images\\image"+sum+".jpg");14d18c02628675d0a2c816449d98bda930.png            sum++;15d18c02628675d0a2c816449d98bda930.png            DataInputStream dis=newDataInputStream(socket.getInputStream());16d18c02628675d0a2c816449d98bda930.png            DataOutputStream dos=newDataOutputStream(socket.getOutputStream());17d18c02628675d0a2c816449d98bda930.png18d18c02628675d0a2c816449d98bda930.pngFileOutputStream out=newFileOutputStream(file);19d18c02628675d0a2c816449d98bda930.pngintwidth=dis.readInt();20d18c02628675d0a2c816449d98bda930.pngintheight=dis.readInt();21d18c02628675d0a2c816449d98bda930.png            System.out.println("width:"+width+"--> height:"+height);22d18c02628675d0a2c816449d98bda930.pngbyte[] buffer1=newbyte[MAX_COUNT];23d18c02628675d0a2c816449d98bda930.pngintsize=width*4*height;24d18c02628675d0a2c816449d98bda930.pngbyte[] buffer=newbyte[size];25d18c02628675d0a2c816449d98bda930.pngintcount=0,num=0;2697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifwhile(true){27d18c02628675d0a2c816449d98bda930.png                count=dis.read(buffer1,0,MAX_COUNT);28d18c02628675d0a2c816449d98bda930.png                System.arraycopy(buffer1,0, buffer, num, count);29d18c02628675d0a2c816449d98bda930.png                num+=count;30d18c02628675d0a2c816449d98bda930.png                System.out.println("length:"+num+"-->"+count);3197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(num==size){32d18c02628675d0a2c816449d98bda930.png                    Image TheImage=readImage32(buffer, height, width);33d18c02628675d0a2c816449d98bda930.png                    BufferedImage tag=newBufferedImage(width, height,34d18c02628675d0a2c816449d98bda930.png                            BufferedImage.TYPE_INT_RGB);35d18c02628675d0a2c816449d98bda930.png                    tag.getGraphics().drawImage(TheImage,0,0, width, height,null);36d18c02628675d0a2c816449d98bda930.png                    System.out.println(file.getName());37d18c02628675d0a2c816449d98bda930.png//JPEGImageEncoder jpegImage = JPEGCodec.createJPEGEncoder(out);38d18c02628675d0a2c816449d98bda930.png//jpegImage.encode(tag);39d18c02628675d0a2c816449d98bda930.pngImageIO.write(tag,"JPEG", out);40d18c02628675d0a2c816449d98bda930.png                    System.out.println("传输完成:");41d18c02628675d0a2c816449d98bda930.png                    out.close();42d18c02628675d0a2c816449d98bda930.png                    dis.close();43d18c02628675d0a2c816449d98bda930.png}45ecedf933ec37d714bd4c2545da43add2.png            }46d18c02628675d0a2c816449d98bda930.png471fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif        }catch(Exception e){48d18c02628675d0a2c816449d98bda930.png             e.printStackTrace();498f1ba5b45633e9678d1db480c16cae3f.png        }      上面就是接收数据处理的大部分代码,就不做解释了,其中的readImage32是对接收过来的二进制数据进行转换得到图片各像素点的值,具体代码就不贴了。

主要考滤到Flex在处理图片上进行格式的转换相当的慢,到无法忍受的地步,所以采用后台Java来处理,从实验的结果上看对前台不怎么影响,在一定程度上得到改善,希望有这方面经验的人多指点,提出宝贵的意见,

422db6b478ebe88ebb1e178fb970bf7c.gif

这是我第一次写Blog,请多多支持

4c17f6cb334ea4665c69ab95d250a8bf.gif

posted on 2011-05-19 10:53 The Conqueror 阅读(2405) 评论(2)  编辑  收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值