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

目录
相关文章
|
4天前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
|
4天前
|
网络协议 程序员 Python
揭秘Python网络编程:深入理解Socket通信
在当今信息时代,网络通信已经成为人们生活中不可或缺的一部分。而Python作为一种高效、易用的编程语言,自然也能够很好地支持网络编程和Socket通信。本文将介绍Python网络编程与Socket通信的相关知识,包括Socket通信模型、Socket编程接口、网络套接字等内容。
|
4天前
|
网络协议 开发者 Python
Python网络编程与Socket通信:连接世界的无限可能
在当今数字化时代,Python作为一种强大的编程语言,通过网络编程与Socket通信为我们打开了连接世界的无限可能。本文将深入探讨Python网络编程的基础知识、Socket通信的原理以及实际应用,帮助读者更好地理解并运用这一技术。
|
4天前
|
网络协议
【Netty 网络通信】Socket 通信原理
【1月更文挑战第9天】【Netty 网络通信】Socket 通信原理
|
4天前
|
JSON JavaScript 前端开发
【JavaScript技术专栏】JavaScript的跨域通信方法
【4月更文挑战第30天】本文探讨了JavaScript中的跨域通信方法,包括:同源策略和跨域通信的概念,以及JSONP、CORS、WebSockets、`window.postMessage()`、代理服务器和WebAssembly的使用。这些技术各有优劣,适用于不同的场景,是Web开发者解决跨域问题的关键工具。随着Web技术的演进,跨域通信的解决方案也将不断更新。
|
3天前
|
设计模式 存储 消息中间件
JavaScript观察者模式:实现对象间的事件通信!
JavaScript观察者模式:实现对象间的事件通信!
|
4天前
|
XML JSON 网络协议
Socket实现模拟TCP通信粘包问题
Socket实现模拟TCP通信粘包问题
|
4天前
|
Java 开发者 Spring
Java一分钟之-Java网络编程基础:Socket通信
【5月更文挑战第13天】本文介绍了Java Socket编程基础知识,包括使用`ServerSocket`和`Socket`类建立连接,通过`OutputStream`和`InputStream`进行数据传输。常见问题涉及忘记关闭Socket导致的资源泄漏、网络异常处理及并发同步。理解Socket通信原理并掌握异常处理、资源管理和并发控制,能帮助开发者构建更稳定的网络应用。
28 1
|
4天前
|
网络协议 Java 网络安全
【计算机网络】—— Socket通信编程与传输协议分析
【计算机网络】—— Socket通信编程与传输协议分析
12 0
|
4天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信