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客户端截图:
----------------------------------------------------------------------------------------------------------------------------------------------------------
您的十分满意是我追求的宗旨。
您的一点建议是我后续的动力。
- flex socket.readObject() //flex读取java服务器端发送过来的对象
- flex socket.writeObject()发送对象,java接收flex socket发送过来的对象
- flex 读取返回的java对象
- flex 读取返回的java对象
- flex端发送字符串到服务器端生成文件的例子(flex中得到request对象的方法)
- ObjectInputStream的readObject()方法读取对象问题
- .Flex通过Java读取Excel(详细流程)----Excel在服务器端
- Flex给服务器端传送对象
- flex 得到Java传过来的xml 显示到datagrid
- Flex+Java Socket多线程
- Flex+Java Socket多线程
- java 和 Flex 之间的Socket通信
- flex与JAVA的SOCKET通信
- Flex接收51单片机发送过来的16进制数据转换为String
- flex的Socket通信
- flex的Socket通信
- flex的Socket通信
- flex访问java对象
- VisualNet图形化的电力综合布线管理系统的应用实例展示
- 人生顿悟之那绝不是人脉
- linux系统监控工具之top命令详解
- 为什么有时类的析构函数要定义为protected呢?
- mac系统下发布qt第三方的应用程序(opencv)
- flex socket.readObject() //flex读取java服务器端发送过来的对象
- Windbg内核调试下调试应用层
- 资源Android目录
- awk以列为关键词统计出现次数
- warning:dereferencing type-punned pointer will break strict-aliasing rules
- _com_util::ConvertBSTRToString BUG解决方案(转载)
- 打印
- NSArray,NSSet等集合类的使用
- Nano-X图形库