as3与node.js的socket通信

来源:互联网 发布:php在线客服系统源码 编辑:程序博客网 时间:2024/06/06 10:43

as3与node.js的socket通信

 

这里使用了一个单例的SocketManager类:

 conn =  Socket();
             
 conn.addEventListener(Event.CLOSE, onSocketCloseHandler);
 conn.addEventListener(Event.CONNECT, onSocketConnectHandler);
 conn.addEventListener(IOErrorEvent.IO_ERROR, onSocketIOErrorHandler);
 conn.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSocketSecurityHandler);
 conn.addEventListener(ProgressEvent.SOCKET_DATA, onSocketDataHandler);

SocketManager最多在连接失败时,进行5次重连。建立socket连接代码:

  function connSocket(url:String, port:Number, _endian:String=):
 {
      (conn == null)
     {
         initSocket();
     }
     
      (_endian == )
     {
         _endian = Endian.BIG_ENDIAN;
     }
     
     CURR_RECONN_NUM = 0;
     
     conn.endian = _endian;
     
     socket_url = url;
     socket_port = port;
     
     conn.connect(socket_url, socket_port);
 }

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

 
 
  
  function send(bytes:IMeteoricByteArray):Boolean
 {
      (checkConnIsSuc() == false)
     {
          false;
     }
     
     var bytes_len:uint = bytes.size();
     
     var byteArr:ByteArray =  ByteArray();
     
     byteArr.writeInt(bytes_len + headLen);
     byteArr.writeBytes(bytes.getByte());
     
     conn.writeBytes(byteArr);
     conn.flush();
     
     bytes.dispose();
     
      true;
 }

格式:数据包头部长度(int-带符号的32位整数)|消息标识(short-16位整数)|消息返回标识(short-16位整数)|…

bytes.writeInt();

bytes.writeShort();

bytes.writeShort();

bytes…

 

根据不同的消息标识(唯一),后台获取标识后调用不同的解析方法,解析客户端发送的数据

 

前台as3建立socket,发送数据、解析数据,网上很多例子,这里不重点说了。这里重点介绍node.js如何解析消息(不使用任何第三方库):

 var net  = require();
 var clients = [];
  
 var HOST = ;
 var PORT = 7000;
  
 net.createServer(function(socket) {    
  
     console.log( + socket.remoteAddress ++ socket.remotePort);
  
     clients.push(socket);
  
     socket.on(, function(data) {
         console.log( + socket.remoteAddress ++ socket.remotePort);
  
         var isBuffer = Buffer.isBuffer(data);
  
          (isBuffer) {
             var offset = data[](0);
             var headCode = data[](offset);
             offset += 2;
             var headBackCode = data[](offset);
             offset += 2;         
             
             
             var len = data[](offset);
             offset += 2;
             
             var msg = data.toString(, offset, offset + len)
  
             console.log(headCode +  + headBackCode +  + msg);
  
             broadcast(msg, socket);
         }  {
             console.log();
         }
         
     });
  
     socket.on(, function() {
         console.log( + socket);        
         clients.splice(clients.indexOf(socket));
     });
  
     function broadcast(message, sender) {
         clients.forEach(function(client) {
             
                 client.write(message);
             
         });
     }
  
 }).listen(PORT, HOST);
  
  
 console.log();

 

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

 

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

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

 

上面的解析过程可能比较繁琐,你可以使用Node.js的ByteBuffer (nodejs的ByteBuffer,和C++通信的利器!)

作者:play175

https://npmjs.org/package/ByteBuffer

 

使用方法也比较简单:

var buf =  ByteBuffer(data);var arr = buf.int32()                            .()        .()        .string()                    .unpack();console.log(arr);broadcast(arr[3], socket);var offset = data[](0);var headCode = data[](offset);offset += 2;var headBackCode = data[](offset);offset += 2;         var len = data[](offset);offset += 2;var msg = data.toString(, offset, offset + len)console.log(headCode +  + headBackCode +  + msg);broadcast(msg, socket);

 

有兴趣的可以下载全部源码(Flex-SDK4.5 + node.js),点此立即下载>>


转载:http://www.cnblogs.com/meteoric_cry/archive/2012/12/15/2819563.html

来自:http://www.verydemo.com/demo_c134_i50667.html

0 0
原创粉丝点击