as3与node.js的socket通信

这里使用了一个单例的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('服务已启动');

如果一切正常,前台发送数据时,控制台上能看到解析的数据:

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解析二进制数据>>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java3y

JDK10都发布了,nio你了解多少?

1829
来自专栏我杨某人的青春满是悔恨

Kingfisher源码阅读(二)

上次说到了downloadAndCacheImageWithURL这个方法,看名字就知道既要下载图片又要缓存图片,它的方法体是这样的:

1665
来自专栏后端技术探索

使用Swoole异步发送邮件

最近做公司的一个管理系统,需要把每天的统计信息发送到领导的邮箱。由于使用SMTP协议发送邮件的速度太慢,所以只能异步发送。刚开始实现了一个基于php-reque...

1881
来自专栏小尘哥的专栏

小程序(3):授权登录

判断是否授权,如果没有,则显示授权按钮。注意上面的open-type="getUserInfo",这个会自动调起授权框。看一下js

2444
来自专栏程序员叨叨叨

当你刷新RecyclerView程序崩掉的时候

今天测试 APP的时候发现一个有关RecyclerView的BUG,我们先上图来看看崩溃情况:

1402
来自专栏SDNLAB

Open vSwitch源码解析之基于VxLAN实现NSH解析功能

1. NSH-SFC概述 当前SFC的实现方案主要分为两种:一种基于NSH(network service header)。数据封装时,在L2或者L3数据后添加...

6155
来自专栏菩提树下的杨过

Silverlight:分包下载及SEO优化方案

一、按模块分包 一般大型的Silverlight应用,都会按模块分解成多个silverlight project,编译后就有多个xap包,然后在需要用到的场景按...

1935
来自专栏小灰灰

Java & PhantomJs 实现html输出图片

Java & PhantomJs 实现html输出图片 借助phantomJs来实现将html网页输出为图片 I. 背景 如何在小程序里面生成一张图,分享到朋...

7178
来自专栏逆向技术

逆向实用干货分享,Hook技术第一讲,之Hook Windows API

             逆向实用干货分享,Hook技术第一讲,之Hook Windows API 一丶什么是Hook,以及Hook能干啥 首先这一个小标题主要...

3787
来自专栏张戈的专栏

移动搜索SEO:网站移动适配之Meta标注、移动跳转终结篇

这些天,在给博客的标签页(tag)添加跳转和 META 动态申明时,居然让我醍醐灌顶,发现之前的动态适配的做法是多么的苦逼和小白! 总结前,先来回顾下小白张戈在...

5066

扫码关注云+社区

领取腾讯云代金券