设为首页 收藏本站
查看: 866|回复: 0

[经验分享] as3与node.js的socket通信

[复制链接]

尚未签到

发表于 2017-2-23 11:27:41 | 显示全部楼层 |阅读模式
DSC0000.png

  这里使用了一个单例的SocketManager类:
  
   
   1: conn = new Socket();

   2:            

   3: conn.addEventListener(Event.CLOSE, onSocketCloseHandler);

   4: conn.addEventListener(Event.CONNECT, onSocketConnectHandler);

   5: conn.addEventListener(IOErrorEvent.IO_ERROR, onSocketIOErrorHandler);

   6: conn.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSocketSecurityHandler);

   7: conn.addEventListener(ProgressEvent.SOCKET_DATA, onSocketDataHandler);
  SocketManager最多在连接失败时,进行5次重连。建立socket连接代码:





   1: public function connSocket(url:String, port:Number, _endian:String=""):void

   2: {

   3:     if (conn == null)

   4:     {

   5:         initSocket();

   6:     }

   7:     

   8:     if (_endian == '')

   9:     {

  10:         _endian = Endian.BIG_ENDIAN;

  11:     }

  12:     

  13:     CURR_RECONN_NUM = 0;

  14:     

  15:     conn.endian = _endian;

  16:     

  17:     socket_url = url;

  18:     socket_port = port;

  19:     

  20:     conn.connect(socket_url, socket_port);

  21: }
  如果需要发送socket数据,直接调用send方法:





   1: /**

   2:  * 发送数据

   3:  */

   4: private function send(bytes:IMeteoricByteArray):Boolean

   5: {

   6:     if (checkConnIsSuc() == false)

   7:     {

   8:         return false;

   9:     }

  10:     

  11:     var bytes_len:uint = bytes.size();

  12:     

  13:     var byteArr:ByteArray = new ByteArray();

  14:     

  15:     byteArr.writeInt(bytes_len + headLen);

  16:     byteArr.writeBytes(bytes.getByte());

  17:     

  18:     conn.writeBytes(byteArr);

  19:     conn.flush();

  20:     

  21:     bytes.dispose();

  22:     

  23:     return true;

  24: }
  格式:数据包头部长度(int-带符号的32位整数)|消息标识(short-16位整数)|消息返回标识(short-16位整数)|…
  bytes.writeInt();
  bytes.writeShort();
  bytes.writeShort();
  bytes…
  根据不同的消息标识(唯一),后台获取标识后调用不同的解析方法,解析客户端发送的数据
  前台as3建立socket,发送数据、解析数据,网上很多例子,这里不重点说了。这里重点介绍node.js如何解析消息(不使用任何第三方库):





   1: var net  = require('net');

   2: var clients = [];

   3:  

   4: var HOST = '127.0.0.1';

   5: var PORT = 7000;

   6:  

   7: net.createServer(function(socket) {   

   8:  

   9:     console.log('Connected: ' + socket.remoteAddress +':'+ socket.remotePort);

  10:  

  11:     clients.push(socket);

  12:  

  13:     socket.on('data', function(data) {

  14:         console.log('receive data:' + socket.remoteAddress +':'+ socket.remotePort);

  15:  

  16:         var isBuffer = Buffer.isBuffer(data);

  17:  

  18:         if (isBuffer) {

  19:             var offset = data['readInt32BE'](0);

  20:             var headCode = data['readInt16BE'](offset);

  21:             offset += 2;

  22:             var headBackCode = data['readInt16BE'](offset);

  23:             offset += 2;         

  24:            

  25:            

  26:             var len = data['readInt16BE'](offset);

  27:             offset += 2;

  28:            

  29:             var msg = data.toString('utf8', offset, offset + len)

  30:  

  31:             console.log(headCode + '-' + headBackCode + '-' + msg);

  32:  

  33:             broadcast(msg, socket);

  34:         } else {

  35:             console.log('Message is not Buffer!');

  36:         }

  37:         

  38:     });

  39:  

  40:     socket.on('end', function() {

  41:         console.log('Close Connected: ' + socket);        

  42:         clients.splice(clients.indexOf(socket));

  43:     });

  44:  

  45:     function broadcast(message, sender) {

  46:         clients.forEach(function(client) {

  47:             //if (client === sender) {

  48:                 client.write(message);

  49:             // }

  50:         });

  51:     }

  52:  

  53: }).listen(PORT, HOST);

  54:  

  55:  

  56: console.log('服务已启动');
  如果一切正常,前台发送数据时,控制台上能看到解析的数据:
DSC0001.png

DSC0002.png

  1000是头标识,10为消息返回标识,abcdefg为发送的字符串。





   1: var data:MeteoricSocketSendDataProxy = SocketManager.getInstance().getSocketSendDataProxy(1000, 10) as MeteoricSocketSendDataProxy;

   2: data.addStringData(msg);

   3:  

   4: SocketManager.getInstance().sendDataProxy(data);
  上面的解析过程可能比较繁琐,你可以使用Node.js的ByteBuffer (nodejs的ByteBuffer,和C++通信的利器!)
  作者:play175
  https://npmjs.org/package/ByteBuffer
  使用方法也比较简单:



//使用ByteBuffer进行解包操作
var buf = new ByteBuffer(data);
var arr = buf.int32()                    
        .short()
        .short()
        .string()            
        .unpack();
console.log(arr);
broadcast(arr[3], socket);

/*************************************************/
//原方法
var offset = data['readInt32BE'](0);
var headCode = data['readInt16BE'](offset);
offset += 2;
var headBackCode = data['readInt16BE'](offset);
offset += 2;         

var len = data['readInt16BE'](offset);
offset += 2;
var msg = data.toString('utf8', offset, offset + len)
console.log(headCode + '-' + headBackCode + '-' + msg);
broadcast(msg, socket);

  有兴趣的可以下载全部源码(Flex-SDK4.5 + node.js),点此立即下载>>
  参考资料:
  AS3 Socket类
  Node.js ByteBuffer
  Node.js Buffer
  http://nodejs.org/api/buffer.html
  JavaScript解析二进制数据>>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346179-1-1.html 上篇帖子: as3与node.js的socket通信 下篇帖子: BDD测试利器:mocha+should.js
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表