隨筆-1  評論-2  文章-0  trackbacks-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
           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+=count;
          30                System.out.println("length:" +num+"-->"+count);
          31                if (num==size) {
          32                    Image TheImage = readImage32(buffer, height, width);
          33                    BufferedImage tag = new BufferedImage(width, height,
          34                            BufferedImage.TYPE_INT_RGB);
          35                    tag.getGraphics().drawImage(TheImage, 00, 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 閱讀(2482) 評論(2)  編輯  收藏

          評論:
          # re: 基于Socket實現Flex與Java通信 2011-05-24 23:14 | macleo
          大牛...第一次寫就寫這么有深度的...pf  回復  更多評論
            
          # re: 基于Socket實現Flex與Java通信 2011-05-25 08:55 | The Conqueror
          @macleo
          我寫的不好,你可以直接把我說錯的地方提出來,我好改正,沒必要說那些垃圾話吧  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 正定县| 青阳县| 基隆市| 隆昌县| 普兰县| 沅陵县| 宁夏| 雷州市| 云林县| 富裕县| 四平市| 信丰县| 鸡东县| 肥西县| 汤原县| 吴桥县| 宝兴县| 新蔡县| 海阳市| 靖江市| 河津市| 成安县| 海南省| 繁昌县| 达孜县| 西丰县| 金秀| 湛江市| 台湾省| 长汀县| 锦屏县| 杨浦区| 贵港市| 高尔夫| 磐安县| 肇源县| 潍坊市| 桐庐县| 通州市| 绍兴县| 伊春市|