as3与node.js的socket通信

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

目录
相关文章
|
1月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
|
3月前
|
网络协议 程序员 Python
揭秘Python网络编程:深入理解Socket通信
在当今信息时代,网络通信已经成为人们生活中不可或缺的一部分。而Python作为一种高效、易用的编程语言,自然也能够很好地支持网络编程和Socket通信。本文将介绍Python网络编程与Socket通信的相关知识,包括Socket通信模型、Socket编程接口、网络套接字等内容。
|
3月前
|
网络协议 开发者 Python
Python网络编程与Socket通信:连接世界的无限可能
在当今数字化时代,Python作为一种强大的编程语言,通过网络编程与Socket通信为我们打开了连接世界的无限可能。本文将深入探讨Python网络编程的基础知识、Socket通信的原理以及实际应用,帮助读者更好地理解并运用这一技术。
|
3月前
|
网络协议
【Netty 网络通信】Socket 通信原理
【1月更文挑战第9天】【Netty 网络通信】Socket 通信原理
|
5月前
|
存储 Cloud Native Linux
C++封装了socket通信类
C++封装了socket通信类
|
6月前
|
存储
14.10 Socket 套接字选择通信
对于网络通信中的服务端来说,显然不可能是一对一的,我们所希望的是服务端启用一份则可以选择性的与特定一个客户端通信,而当不需要与客户端通信时,则只需要将该套接字挂到链表中存储并等待后续操作,套接字服务端通过多线程实现存储套接字和选择通信,可以提高服务端的并发性能,使其能够同时处理多个客户端的请求。在实际应用场景中,这种技术被广泛应用于网络编程、互联网应用等领域。在服务端启动时,创建套接字并进行绑定,然后开启一个线程(称为主线程)用于监听客户端的连接请求。主线程在接收到新的连接请求后,会将对应的套接字加入一个数据结构(例如链表、队列、哈希表等)中进行存储。同时,主线程会将存储套接字的数据结构传递给
25 1
14.10 Socket 套接字选择通信
|
3天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
24天前
|
网络协议 Unix Linux
Socket通信详细介绍1
Socket通信详细介绍
30 0
|
2月前
|
C++
C++实现Socket连接通信
C++实现Socket连接通信
13 1