从零开始搭建node.js+xmlSocket的WEB聊天室(二)

二、实现flash xmlSocket封装

因为所有逻辑中socket client变化最少,也最简单,封装完了基本不用更改了,所以先从这里开始。

打开用任意文本编辑器,新建一个.as文件。

代码如下:

package
{

	import flash.display.Sprite;
	import flash.events.DataEvent;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.SecurityErrorEvent;
	import flash.external.ExternalInterface;
	import flash.media.Camera;
	import flash.media.Microphone;
	import flash.net.XMLSocket;

	public class socket extends Sprite {

		private var xmlSocket:XMLSocket;

		public function socket():void {

			ExternalInterface.marshallExceptions = true;
			xmlSocket = new XMLSocket();
			xmlSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onError);
			xmlSocket.addEventListener(Event.CLOSE,onClose);
			xmlSocket.addEventListener(Event.CONNECT,onConnect);
			xmlSocket.addEventListener(IOErrorEvent.IO_ERROR,onIoError);
			xmlSocket.addEventListener(DataEvent.DATA,onMessage);
			ExternalInterface.addCallback("connect", function(host: String, port: int): void {
				xmlSocket.connect(host,port);
			});
			
			ExternalInterface.addCallback("send", function(object: *): void{
				xmlSocket.send(object);
			});

			ExternalInterface.addCallback("close", function(): void{
				xmlSocket.close();
			});

			ExternalInterface.addCallback("hasCamera", function(): Boolean {
				return Camera.isSupported;
			});

			ExternalInterface.addCallback("hasMicrophone", function(): Boolean{
				return Microphone.isSupported;
			});

			ExternalInterface.call("onReady");
		}

		private function onConnect(e: Event): void{
			ExternalInterface.call("onConnect", e.toString());
		}

		private function onMessage(de: DataEvent): void{
			ExternalInterface.call("onMessage", de.data);
		}

		private function onClose(e:Event): void{
			ExternalInterface.call("onClose", e.toString());
		}

		private function onError(e:SecurityErrorEvent): void{
			ExternalInterface.call("onError", e.toString());
		}

		private function onIoError(e:IOErrorEvent): void{
			ExternalInterface.call("onError",e.toString());
		}

	}

}

在dos环境下编译.as文件成swf

c:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\bin>mxmlc –static-lin
k-runtime-shared-libraries socket.as
正在加载配置文件“C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\fram
eworks\flex-config.xml”
C:\Program Files\Adobe\Adobe Flash Builder 4.6\sdks\4.6.0\bin\socket.swf(1109
字节)

当然你也可以直接在flash builder/flash cs里建立as文件,然后编译。

注意:要使用mxmlc命令,必须安装flash builder。

这一步所做的事情其实非常简单,将xmlsocket的几个“socket事件”绑定到前端的javascript函数上去,一旦socket事件触发,就会触发相应的javasctrip function,并且将数据在js端和server端传递,很多webgame都是基于这样的方式来实现socket的。

这里我们同时注册了hasCamera和hasMicrophone两个函数,用来判断客户端是否具有摄像头和麦克风,以后可以进一步扩展实现基于FMS的视频聊天室。

其实使用flash xmlsocket并不是原生的解决方案,基于HTML5的websocket或许才是最完美的方案,这里为了“看起来更象”html5的 websocket,几个函数也被命名和html5 websocket类似,只是没有进一步封装进javascript类,而且这里也只能对单一socket server连线,如果某些应用需要同时连接多个socket server,也需要进一步处理,有兴趣的同学可以进一步封装。

发表评论