参考文章: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客户端截图:
----------------------------------------------------------------------------------------------------------------------------------------------------------
![](https://i-blog.csdnimg.cn/blog_migrate/a093afbd4c527d0317d466375f43de72.png)
您的十分满意是我追求的宗旨。
您的一点建议是我后续的动力。