您的位置:首页 > 移动开发 > Objective-C

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

2013-12-30 15:55 357 查看
参考文章: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客户端截图:



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




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

您的一点建议是我后续的动力。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: