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

flex socket.writeObject()发送对象,java接收flex socket发送过来的对象

2013-12-29 11:49 501 查看
参考文章:

//java与as3,amf交互相互解析vo数据例子

http://www.cnblogs.com/pelephone/archive/2012/04/03/java-as3-amf-vo.html

http://hi.baidu.com/w542676619/item/6f5aedd980e2703b48e1dd82 //Amf3数据格式

http://d2100.com/questions/39379 //flex 和 java 序列化的对象使用的套接字通信

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

本篇文章要解决的问题是:

flex socket发送as对象到java服务器端,服务器端如何接收、解析flex socket发送过来的as对象呢?

我的解决方法:

在服务器端使用AMF3来解析flex socket发送过来的as对象。

注:java使用AMF3需要用到以下两个jar包:

flex-messaging-common.jar http://download.csdn.net/detail/friendan/6782955

flex-messaging-core.jar http://download.csdn.net/detail/friendan/6782957

以上两个jar包可以从BlazeDS中提取出来,然后放到java工程里面即可。

BlazeDS下载地址:http://download.csdn.net/detail/friendan/6782947

截图如下:



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

准备好以上说的两个jar包后,就可以开始java服务器端的编程了。

java服务器端的VO类如下:

package socket; //vo对象所在的包

import java.io.Serializable;//导入接口

//因为类要在网络上传输,所以必须序列化,即实现Serializable接口
//注意类User的全名为socket.User,即包名.类名
public class User implements Serializable{
	int id;
	String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

java服务器端的socket监听类如下:

package socket;

import java.io.*;
import java.net.*;
import java.util.*;

public class Server {
	
	//启动服务器Socket
	public static void StartServer()
	{
		try {
			ServerSocket server = new ServerSocket(10000);
			System.out.println("服务器启动成功,正在监听客户端连接!...");
			while (true) {
				Socket socket = server.accept();
				System.out.println("有客户端连接...");
				SocketThread st=new SocketThread(socket);
				st.run();
			}
		} 
		catch (IOException e) {
			e.printStackTrace();
		}
	}
}


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

接下来就是java服务器端最重要的socket线程函数编写了,这里我将socket线程函数封装在了一个类SocketThread中,

在socket线程函数中,我们使用AMF3来解析flex socket发送过来的对象,具体代码如下:

package socket;
import java.io.*;
import java.net.*;
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;
	
	public SocketThread(Socket client){//构造函数
		this.client=client;
	}
	
	public void run(){ //线程函数
        try {
        	System.out.println("Socket线程函数正在运行!...");
        	SerializationContext sercontext=new SerializationContext();  //序列化
        	Amf3Input amf3input=new Amf3Input(sercontext);//创建AMF3对象
        	amf3input.setInputStream(client.getInputStream());//获取AMF3输入流
        	
			while(true){
				User user=(User)amf3input.readObject();//AMF3读取flex发送过来的as对象
				System.out.println(user.getId()+"  "+user.getName());
			}
			
		} 
        catch (Exception e) {e.printStackTrace();}
        finally
		{
			try {
				System.out.println("客户端断开连接!...");
				if(client!=null) client.close();
			} 
			catch (Exception e) {}
		} 
    } 
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以上就是java服务器端的主要代码了,接下来我们编写flex客户端的代码。

flex客户端的vo类代码如下:

package vo
{
	[Binable]
	[RemoteClass(alias="socket.User")]//注意:这里要与服务器端的VO类对应
	public class User 
	{
		public var id:int;
		public var name:String;
	}
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在flex的mxml文件中导入要用到的包:

import flash.events.*;

import flash.net.Socket;

import flash.net.registerClassAlias;

import mx.controls.Alert;

import mx.events.FlexEvent;

import mx.managers.PopUpManager;

import vo.User;

然后创建flex的socket对象:

var socket:flash.net.Socket=new flash.net.Socket();

截图如下:



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

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("连接成功,数据发送完毕!");
			}
			
			//连接服务器关闭事件
			protected function onConnectionClose(event:Event):void
			{
				Alert.show("连接关闭!");
			}
			
			//服务器发数据过来事件
			protected function onHaveData(event:Event):void
			{
				Alert.show("有数据到来");
			}


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

到这里,java服务器端和flex客户端的主要代码就写好了,先启动服务器socket,

然后运行flex客户端程序,就可以进行测试了,我测试的结果截图如下:

//flex socket连接服务器成功。




//服务器成功接收flex socket发送过来的对象。



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




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

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