JAVA與actionscript通信 別人的經驗

 問題: 服務器是用java寫的,客戶端是用actionscript(使用amf3)寫的,但是服務器端只發送了兩次信息,
客戶端卻接收到三次數據,服務器端也是同樣的問題,接收到客戶端的三次數據,但是客戶端也只發了
兩次信息。

 

 

由於socket傳輸數據時是按固定的大小傳送字節數據的,但是在flash客戶端讀取的
時候是靠一個readObject方法,也就是每次flash客戶端讀取的時候都是按一個完整
的對象來讀取每一次的socket的,但是在服務器端有可能socket將一個完整的序列化
對象給分開來傳輸,這也就是我們遇到的問題,爲什麼有時候能夠正常接收到數據,而
有時候卻只是接收到數據卻無法讀取的原因。解決的辦法就是在客戶端讀取數據之前,
先將數據存放在一個容器裏面(這個需要大家自己去想了),等flash客戶端接收到所有
的數據之後,再從該容器中將該對象讀取出來,這樣問題就解決了。

 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;

import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.ASObject;
import flex.messaging.io.amf.Amf3Input;
import flex.messaging.io.amf.Amf3Output;

public class LgServerThread extends Thread
{
    SerializationContext seri=new SerializationContext();//序列化輸入輸出流
   
    Amf3Output amfout=new Amf3Output(seri);//格式化輸出流
    Amf3Input amfin=new Amf3Input(seri);//格式化輸入流
   
    ByteArrayOutputStream baos=new ByteArrayOutputStream();//創建二進制輸入流
    ByteArrayInputStream bais=null;//創建二進制輸入流
   
    DataOutputStream dos=new DataOutputStream(baos);//轉化二進制流爲數據輸出流
    DataInputStream dis=null;//創建輸入流
    Socket socket;
   
    InputStreamReader isr;//將輸入流信息由字符型轉換爲字節型
    BufferedReader br;//將輸入流信息放入緩存
   
    OutputStreamWriter osw = null;//使用amf3格式將寫入流中的數據編碼成字節
    BufferedWriter bw;//用來封裝OutputStreamWriter,以提高效率
   
    Boolean eventFlag=true;
   
    //LgServerThread的構造函數
    public LgServerThread(Socket socket)
    {
        this.socket=socket;
    }
   
    public void Init()
    {
        try {
            amfin.setInputStream(socket.getInputStream());
            amfout.setOutputStream(dos);
           
            isr=new InputStreamReader(socket.getInputStream());
            br=new BufferedReader(isr);//將流中的數據放入緩存
           
            osw=new OutputStreamWriter(socket.getOutputStream());//將字符流轉化爲字節流
             bw=new BufferedWriter(osw);//封裝osw對象,提高寫入的效率
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void run()
    {
         HashMap map;
        try {
            Init();
            while(eventFlag)
            {
                ASObject message = ReceiveMsg();
               
                if(message!=null)
                {
                    String event=(String)message.get("event");           

                    if(event!=null)
                    {
                        if(event.equals("cookie"))
                        {
                           map=new HashMap();
                           map.put("event", "checkMsg");
                           map.put("checkRuesult", "true");
                           map.put("session","thisissession");
                          
                           amfout.writeObject(map);//實際上是將map對象寫入到dataoutstream流中
                           dos.flush();//清空緩存
                          
                           map=null;
                          
                              byte[] messageBytes1=baos.toByteArray();//amf3數據
                              socket.getOutputStream().write(messageBytes1);//向流中寫入二進制數據   
                              socket.getOutputStream().flush();
                        }
                        else if(event.equals("requestRoleInit"))
                        {
                            if(message.get("requestMsg").equals("roleInit"))
                            {
                                map=new HashMap();
                                map.put("event", "roleInit");
                                map.put("session", "thisissession");
                                map.put("roleName","estone");
                                map.put("sceneInfo", "map.gif");
                                map.put("roleLocation", "100/100");
                                   
                                amfout.writeObject(map);//實際上是將map對象寫入到 dataoutstream流中
                                dos.flush();//清空緩存
                               
                                map=null;
                               
                                byte[] messageBytes2=baos.toByteArray();//amf3數據
                                socket.getOutputStream().write(messageBytes2);//向流中寫入二進制數據   
                                socket.getOutputStream().flush();
                            }
                        }
                      }
                }
              }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    public ASObject ReceiveMsg()
    {
        ASObject object=null;
        while(true)
        {
                try {
                    object =(ASObject) amfin.readObject();
                    System.out.println();
                    System.out.println("<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>");
                    System.out.println(object);
                    System.out.println("<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>");
                    System.out.println();
                   
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
               }
            return object;
        }
    }
   
    public void SendMsg(byte[] message)
    {
       
    }
}

 

package cls {
    import flash.net.Socket;
    import flash.display.Sprite;
    import flash.events.*;
    import flash.text.TextField;
    public class SocketLink extends Sprite
    {
        private var socket:Socket;
        private var obj:Object;
        private var sessions:String;
        private var infoTxt:TextField;
        private var requestObj:Object;
        public function SocketLink(url:String, port:int):void 
        {
            socket = new Socket();
            socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
            socket.addEventListener(Event.CONNECT, connectHandler);
            socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
            socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
            socket.addEventListener(Event.CLOSE, closeHandler); socket.connect(url, port);
        }
       
        public function init():void 
        {
            var temp = this.parent; infoTxt = temp.infoTxt;
        } //接收服務器數據 
       
        private function socketDataHandler(event:ProgressEvent):void
        {
            infoTxt.appendText("接收數據/n");
            obj = new Object();
            obj = socket.readObject();
            for (var k in obj)
            {
                trace(k + ":" + obj[k]);
            }
            trace("----------------------------------");
            recievedData();
        } //測試接收到的數據 
       
        private function recievedData()
        {
            switch(obj.event)
            {
                case "checkMsg":
                    infoTxt.appendText("第一次接收到的數據爲" + obj.checkRuesult + "," + obj.session + "/n");
                    if (obj.checkRuesult)
                    {
                        infoTxt.appendText("登陸成功" + "/n"); sessions = obj.session; RequestFun();
                    }
                    else 
                    {
                        infoTxt.appendText("登陸失敗" + "/n");
                    }
                    break;
                case "roleInit":
                    infoTxt.appendText("第二次接收到的數據爲" + obj.session + "," + obj.roleName + "," + obj.sceneInfo + "," + obj.roleLocation + "/n");
                    infoTxt.appendText("當前的session爲:" + obj.session + ",將人物" + obj.roleName + "移動到地圖" + obj.sceneInfo +"的" + obj.roleLocation + "的位置" + "/n");
                    break;
            }
        }
       
        private function RequestFun():void 
        {
            requestObj = new Object();
            requestObj = { event:"requestRoleInit", session:sessions, userName:"zhangfan", requestMsg:"roleInit" };
            socket.writeObject(requestObj); socket.flush();
        } //Socket已連接,發送數據 
       
        private function connectHandler(event:Event):void
        {
            infoTxt.appendText("連接成功" + "/n");
            requestObj = new Object(); requestObj = { event:"cookie", cookie:"cookieMsg" };
            socket.writeObject(requestObj); socket.flush();
        } //錯誤處理
           
        private function ioErrorHandler(event:IOErrorEvent):void
        {
            infoTxt.appendText("ioErrorHandler信息: " + event + "/n");
        } //安全問題處理 
       
        private function securityErrorHandler(event:SecurityErrorEvent):void
        {
            infoTxt.appendText("securityErrorHandler信息: " + event + "/n");
        } //關閉Socket連接 
       
        private function closeHandler(event:Event):void
        {
            infoTxt.appendText("連接關閉" + "/n");
        }
       
    }
}

  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章