Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4999076
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2012-07-03 23:01:05

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

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

查阅了相关资料:

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

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

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

  1. package {
  2.     import flash.display.Sprite;
  3.     import flash.events.*;
  4.     import flash.net.Socket;
  5.     import flash.utils.*;
  6.     import flash.external.ExternalInterface;
  7.     import flash.system.*;
  8.     public class SocketBridge extends Sprite {
  9.         Socket.prototype.timeout    =3000;
  10.         private var socket:Socket;
  11.         public function SocketBridge()
  12.         {
  13.             socket = new Socket();
  14.             socket.addEventListener( Event.CONNECT, onConnect );
  15.             socket.addEventListener( ProgressEvent.SOCKET_DATA, onDataRecevice);
  16.             socket.addEventListener( Event.CLOSE, onClose);
  17.             socket.addEventListener( IOErrorEvent.IO_ERROR, onError);
  18.             
  19.             if(ExternalInterface.available)
  20.             {
  21.                 
  22.                 ExternalInterface.addCallback("socket_connect",socket_connect);
  23.                 ExternalInterface.addCallback("socket_send",socket_send);
  24.                 ExternalInterface.addCallback("load_policy",load_policy);
  25.             }
  26.         }
  27.         public function onError(e):void
  28.         {
  29.             ExternalInterface.call("sb_onerror",e.text);
  30.             socket.close();
  31.         }
  32.         public function load_policy(host:String,port):void
  33.         {
  34.             Security.loadPolicyFile("xmlsocket://"+host+":"+port);    
  35.         }
  36.         
  37.         public function socket_connect(host:String,port):void
  38.         {
  39.             try{
  40.                 socket.connect(host,port);
  41.             }catch(e){
  42.                 ExternalInterface.call("sb_onerror",e.text);
  43.             }
  44.         }
  45.         
  46.         public function socket_send(msg:String)
  47.         {    
  48.             socket.writeUTF(msg);
  49.             socket.flush();
  50.         }
  51.         
  52.         private function onConnect(event:Event):void
  53.         {
  54.             ExternalInterface.call("sb_onconnect",true);
  55.         }
  56.         
  57.         private function onClose(event:Event):void
  58.         {
  59.             socket.close();
  60.             ExternalInterface.call("sb_onclose",true);
  61.         }

  62.         private function onDataRecevice( eventrogressEvent ):void
  63.         {
  64.             var sdata:String;
  65.             while(socket.bytesAvailable){
  66.                 sdata = socket.readUTF();
  67.                 ExternalInterface.call("sb_ondata",sdata);
  68.             }
  69.         }

  70.     }
  71. }

from:

阅读(1237) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~