参考文章: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包装ByteArrayOutputStream DataOutputStream 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客户端截图:
----------------------------------------------------------------------------------------------------------------------------------------------------------
您的十分满意是我追求的宗旨。
您的一点建议是我后续的动力。