基於Socket實現Flex與Java通信 – JAVA編程語言程序開發技術文章

 


將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+=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, 0, 0, width, height, null);
36                    System.out.println(file.getName());
37//                    JPEGImageEncoder jpegImage = JPEGCodec.createJPEGEncoder(out);
38//         &nb

發佈留言