flex socket.readObject() //flex读取java服务器端发送过来的对象

来源:互联网 发布:滴滴架构 知乎 编辑:程序博客网 时间:2024/06/05 04:01

参考文章:http://www.open-open.com/lib/view/open1344308065671.html

-----------------------------------------------------------------------------------------------------------------------------------------------

一开始我在java服务器端使用AMF3发送对象给flex客户端的代码如下:

Amf3Output amf3output=null;SerializationContext sercontext=new SerializationContext();  //序列化amf3output=new Amf3Output(sercontext);//创建AMF3输出流对象amf3output.setOutputStream(socket.getOutputStream());//获取AMF3输出流amf3output.writeObject(user);//写人用户对象amf3output.flush();//发送user对象给flex客户端
结果flex客户端在接收java服务器端socket发送过来的对象时老是出错。

经过多次试验之后,我发现需要对java的io流进行包装才行,大致的包装过程为:

1.创建流ByteArrayOutputStream

2.用流DataOutputStream包装ByteArrayOutputStream

3.用AMF3流包装DataOutputStream

4.用AMF3序列化要发送的对象,即这行代码:amf3output.writeObject(user) //序列化对象user

5.序列化好对象后,将其转成字节数组。

-----------------------------------------------------------------------------------------------------------------------------

以上是对要发送的java对象的包装,接下来是对java socket的包装。

6.用流OutputStreamWriter包装socket的输出流。

7.用流BufferedWriter包装OutputStreamWriter

8.可以调用socket的输出流发送对象了。

经过以上流的包装后,flex客户端在接收对象时就不会发生错误了。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

java服务器端的主要代码如下:

package socket;import java.io.*;import java.math.*;import java.net.*;import java.util.Random;import java.util.zip.DeflaterOutputStream;import flex.messaging.io.SerializationContext; //导入AMF3用到的包import flex.messaging.io.amf.Amf3Output;//导入AMF3用到的包import flex.messaging.io.amf.Amf3Input;//导入AMF3用到的包public class SocketThread implements Runnable{Socket client=null;Amf3Input amf3input=null;Amf3Output amf3output=null;public SocketThread(Socket client){//构造函数this.client=client;}public void run(){ //线程函数        try {        System.out.println("Socket线程函数正在运行!...");        SerializationContext sercontext=new SerializationContext();  //序列化        amf3input=new Amf3Input(sercontext);//创建AMF3输入流对象        amf3output=new Amf3Output(sercontext);//创建AMF3输出流对象        amf3input.setInputStream(client.getInputStream());//获取AMF3输入流        amf3output.setOutputStream(client.getOutputStream());//获取AMF3输出流        while(true){User user=(User)amf3input.readObject();//AMF3读取flex发送过来的as对象System.out.println(user.getId()+"  "+user.getName());SendData(user);System.out.println("数据发送完毕...");}}         catch (Exception e) {e.printStackTrace();}        finally{try {System.out.println("客户端断开连接!...");if(client!=null) client.close();if(amf3input!=null) amf3input.close();if(amf3output!=null) amf3output.close();} catch (Exception e) {}}     } //发送数据给客户端public void SendData(User user){try {//创建字节数组输出流 ByteArrayOutputStream byteArrOutput=new ByteArrayOutputStream(); //用DataOutputStream包装ByteArrayOutputStreamDataOutputStream dataOutput=new DataOutputStream(byteArrOutput); //用AMF3输出流包装DataOutputStream amf3output.setOutputStream(dataOutput);  //用AMF3系列化对象amf3output.writeObject(user);//实际上是将user对象写入到dataOutput流中  dataOutput.flush();//清空缓存,即将缓存中的数据全部写入流中//将对象user转化成字节数组  byte[] sendData=byteArrOutput.toByteArray();//amf3数据,即对象user//将字符流转化为字节流  OutputStreamWriter osw=new OutputStreamWriter(client.getOutputStream());BufferedWriter bwrite=new BufferedWriter(osw);//封装osw对象,提高写入的效率       client.getOutputStream().write(sendData);//向流中写入二进制数据  client.getOutputStream().flush(); //开始发送数据} catch (Exception e) {e.printStackTrace();}}}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

flex客户端主要代码如下:

//连接服务器protected function btnConnSrv_clickHandler(event:MouseEvent):void{socket.addEventListener(Event.CONNECT,onConnection);socket.addEventListener(Event.CLOSE,onConnectionClose);socket.addEventListener(ProgressEvent.SOCKET_DATA,onHaveData);socket.connect("127.0.0.1",10000);}//成功连接服务器事件protected function onConnection(event:Event):void{var user:User=new User();user.id=123;user.name="Ando";socket.writeObject(user);//flex socket写入对象socket.flush();//马上发送数据,即发送对象//Alert.show("连接成功,数据发送完毕!");btnConnSrv.label="连接成功";}//连接服务器关闭事件protected function onConnectionClose(event:Event):void{Alert.show("连接关闭!");}//服务器发数据过来事件protected function onHaveData(event:Event):void{var dateFormatter:DateFormatter = new DateFormatter();dateFormatter.formatString = "YYYY-MM-DD JJ:NN:SS";var nowData:String= dateFormatter.format(new Date());txtInfo.text="有数据到来:"+nowData+"\r\n";txtInfo.text+="收到数据大小:"+socket.bytesAvailable;trace("收到的数据大小:"+socket.bytesAvailable);if(socket.bytesAvailable>25){while(socket.bytesAvailable){ var obj:Object=socket.readObject();}}else{var s:String="";while(socket.bytesAvailable){s+=socket.readByte()+" ";}trace(s);}if(obj!=null){trace(obj);txtUser.text=String(obj.id)+"---"+obj.name;}}//发送数据给服务器protected function btnSend_clickHandler(event:MouseEvent):void{var user:User=new User();user.id=int(txtId.text);user.name=txtName.text;socket.writeObject(user);socket.flush();}

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//java服务器端效果截图:



//flex客户端截图:


----------------------------------------------------------------------------------------------------------------------------------------------------------

您的十分满意是我追求的宗旨。

您的一点建议是我后续的动力。








0 0