论坛首页 综合技术论坛

Flash Socket 和 Erlang Socket 通信的注意事项

浏览 5153 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-03  

学erlang有一段时间了,现在在维护一套webim系统
并打算扩展成 webgame 的服务程序

在没有使用包协议的时候,遇到好多粘包问题,实在恼火

查阅了相关资料:

Flash Socket 的 writeUTF() 会自动增加包头长度的协议,刚好对应了
Erlang的Socket选项 {packet,2}

这使得两者的通信非常完美,再也不用担心粘包什么的问题了

 

下面是我写的一个Flash Socket 接口:SocketBridge.as

 

package {
	import flash.display.Sprite;
	import flash.events.*;
	import flash.net.Socket;
	import flash.utils.*;
	import flash.external.ExternalInterface;
	import flash.system.*;
	public class SocketBridge extends Sprite {
		Socket.prototype.timeout	=3000;
		private var socket:Socket;
		public function SocketBridge()
		{
			socket = new Socket();
			socket.addEventListener( Event.CONNECT, onConnect );
			socket.addEventListener( ProgressEvent.SOCKET_DATA, onDataRecevice);
			socket.addEventListener( Event.CLOSE, onClose);
			socket.addEventListener( IOErrorEvent.IO_ERROR, onError); 
			
			if(ExternalInterface.available)
			{
				
				ExternalInterface.addCallback("socket_connect",socket_connect);
				ExternalInterface.addCallback("socket_send",socket_send);
				ExternalInterface.addCallback("load_policy",load_policy);
			}
		}
		public function onError(e):void
		{
			ExternalInterface.call("sb_onerror",e.text);
			socket.close();
		}
		public function load_policy(host:String,port):void
		{
			Security.loadPolicyFile("xmlsocket://"+host+":"+port);	
		}
		
		public function socket_connect(host:String,port):void
		{
			try{
				socket.connect(host,port);
			}catch(e){
				ExternalInterface.call("sb_onerror",e.text);
			}
		}
		
		public function socket_send(msg:String)
		{	
			socket.writeUTF(msg);
			socket.flush();
		}
		
		private function onConnect(event:Event):void 
		{
			ExternalInterface.call("sb_onconnect",true);
		}
		
		private function onClose(event:Event):void 
		{
			socket.close();
			ExternalInterface.call("sb_onclose",true);
		}

		private function onDataRecevice( eventrogressEvent ):void
		{
			var sdata:String;
			while(socket.bytesAvailable){
				sdata = socket.readUTF();
				ExternalInterface.call("sb_ondata",sdata);
			}
		}

	}
}

 

   发表时间:2009-06-05  
底层的粘包效率高 这种事情能不自己做就不自己做
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics