as3与node.js的socket通信

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 这里使用了一个单例的SocketManager类: 1: conn = new Socket(); 2: 3: conn.

 

这里使用了一个单例的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解析二进制数据>>

目录
相关文章
|
2月前
|
监控 算法 JavaScript
基于 Node.js Socket 算法搭建局域网屏幕监控系统
在数字化办公环境中,局域网屏幕监控系统至关重要。基于Node.js的Socket算法实现高效、稳定的实时屏幕数据传输,助力企业保障信息安全、监督工作状态和远程技术支持。通过Socket建立监控端与被监控端的数据桥梁,确保实时画面呈现。实际部署需合理分配带宽并加密传输,确保信息安全。企业在使用时应权衡利弊,遵循法规,保障员工权益。
51 7
|
6月前
|
Python
python socket 简单通信
python socket 简单通信
65 1
|
6月前
|
网络协议 安全 网络安全
网络编程:基于socket的TCP/IP通信。
网络编程:基于socket的TCP/IP通信。
333 0
|
4月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
5月前
|
JSON 前端开发 JavaScript
socket.io即时通信前端配合Node案例
本文介绍了如何使用socket.io库在Node.js环境下实现一个简单的即时通信前端配合案例,包括了服务端和客户端的代码实现,以及如何通过socket.io进行事件的发送和监听来实现实时通信。
83 2
|
4月前
|
JavaScript 前端开发
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
前端js,vue系统使用iframe嵌入第三方系统的父子系统的通信
|
5月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
8月前
|
Java API 开发者
Java网络编程基础与Socket通信实战
Java网络编程基础与Socket通信实战
|
6月前
|
JavaScript 前端开发 Ubuntu
如何在 VPS 上安装 Express(Node.js 框架)并设置 Socket.io
如何在 VPS 上安装 Express(Node.js 框架)并设置 Socket.io
82 0
|
6月前
|
存储 JavaScript 数据库
如何使用 Socket.IO、Angular 和 Node.js 创建实时应用程序
如何使用 Socket.IO、Angular 和 Node.js 创建实时应用程序
46 0

热门文章

最新文章