使用Flash的XMLSocket与Servlet建立长连接(1,建立socket控件)

来源:互联网 发布:美的网络专供 编辑:程序博客网 时间:2024/04/27 19:47

使用Flash的XMLSocket与Servlet建立长连接(1,建立socket控件)

适用范围:当服务端需要向客户机主动发送消息的时候

有些情况,客户端发送一个请求,服务段需要一个很长时间的处理,这个时候,客户端
很可能是个白页,且无法响应。而服务端无法向客户机主动发送消息。

该方法适用于以上这种情况,并以一个进度条为例

1. 建立net.swf
    打开Flash新建一个fla文件
    在第一桢创建一个文本组件,名称为lotTxt,用于输出日志
    打开第一桢的脚本编辑器,切换到专家模式,写入如下脚本:
/*
 * $RCSfile: com.inet.net.fla,v $
 * $Revision: 1.1  $
 *
 * Copyright (C) 2005 inet, Inc. All rights reserved.
 *
 * This software is the proprietary information of inet, Inc.
 * Use is subject to license terms.
 *
 * @author: chenyankui
 * @Date:   2006-9-28
 */

import flash.external.ExternalInterface;
import com.inet.util.UUID;
import com.inet.util.DateFormat;

// 创建新的 StyleSheet 对象。
var logStyles:TextField.StyleSheet = new TextField.StyleSheet();

logStyles.setStyle("html", {fontFamily: "Arial, Helvetica,sans-serif", fontSize: "18px", color:"#FF0000"});
logStyles.setStyle("body", {color: "#00CCFF", textDecoration:"underline"});

// 将 TextAreaInstance.styleSheet 属性设置为新定义的、名为 styles 的 styleSheet 对象。
logTxt.styleSheet = logStyles;
logTxt.html = true;

var logger:Object = new Object();

var format = "";

var debugEnabled:Boolean = false;
var infoEnabled:Boolean  = true;
var logEnabled:Boolean   = true;
var warnEnabled:Boolean  = true;
var errorEnabled:Boolean = true;

var LogLevel = new Object();

LogLevel["DEBUG"] = 1;
LogLevel["INFO"]  = 2;
LogLevel["LOG"]   = 3;
LogLevel["WARN"]  = 4;
LogLevel["ERROR"] = 5;

logger.debug = function(log:String):Void

 if(debugEnabled)
 {
  logTxt.text += "[DEBUG:" + DateFormat.getTime() + "]: " + log + "/n";
 }
}
logger.info = function(log:String):Void

 if(infoEnabled)
 {
  logTxt.text += "[INFO :" + DateFormat.getTime() + "]: " + log + "/n";
 }
}
logger.log = function(log:String):Void

 if(logEnabled)
 {
  logTxt.text += "[LOG  :" + DateFormat.getTime() + "]: " + log + "/n";
 }
}
logger.warn = function(log:String):Void

 if(warnEnabled)
 {
  logTxt.text += "[WARN :" + DateFormat.getTime() + "]: " + log + "/n";
 }
}
logger.error = function(log:String):Void

 if(errorEnabled)
 {
  logTxt.text += "[ERROR:" + DateFormat.getTime() + "]: " + log + "/n";
 }
}

logger.put = function(log:String):Void

  logTxt.text += "[INFO :" + DateFormat.getTime() + "]: " + log + "/n";
}

function clrLog():Void
{
 logTxt.text = "<font color='#FF0000'>Macromedia Flash 8 version:" + System.capabilities.version + "</font><br/>";
}

function setLogLevel(level:String):Number
{
 var k = LogLevel[level];
  
 if(k == null)
 {
  return -1;
 }

 logger.put("当前日志级别: " + level);
 
 debugEnabled = (LogLevel["DEBUG"] >= k);
 infoEnabled  = (LogLevel["INFO"]  >= k);
 logEnabled   = (LogLevel["LOG"]   >= k);
 warnEnabled  = (LogLevel["WARN"]  >= k);
 errorEnabled = (LogLevel["ERROR"] >= k);
 
 logger.put("debugEnabled :" + debugEnabled);
 logger.put("infoEnabled  :" + infoEnabled);
 logger.put("logEnabled   :" + logEnabled);
 logger.put("warnEnabled  :" + warnEnabled);
 logger.put("errorEnabled :" + errorEnabled);
}

clrLog();
//logger.put("<font color='#FF0000'>Macromedia Flash 8 version:" + System.capabilities.version + "</font>");

/*
var df1:DateFormat = new DateFormat("yyyy-MM-dd HH:mm:ss SSS");
var df2:DateFormat = new DateFormat("MM/dd/yy");
var df3:DateFormat = new DateFormat("dd/MM/yy");
var df4:DateFormat = new DateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒");

var dt:Date = df1.parse("2004-02-23 13:24:48 789");

logger.info(dt.toString());
logger.info(df1.format(dt));
logger.info(df2.format(dt));
logger.info(df3.format(dt));
logger.info(df4.format(dt));

logger.info("当前时间:" + df1.format(new Date()));

var a:Number = new Date().getTime();

if(uuid.charAt(0) == "-")
{
 logger.info("++++++");
}

logger.info("" + a.toString(10));
logger.info("" + a.toString(16));
logger.info("" + (256).toString(16));
logger.info("uuid:" + UUID.getUUID());
logger.info("uuid:" + UUID.getUUID());
logger.info("uuid:" + UUID.getUUID());

logger.info("Number.MIN_VALUE = " + Number.MIN_VALUE);
logger.info("Number.MAX_VALUE = " + Number.MAX_VALUE);
*/

clrBtn.addEventListener("click", clrLog);

var onxml:String     = "$SocketOnXml";
var ondata:String    = "$SocketOnData";
var onclose:String   = "$SocketOnClose";
var onconnect:String = "$SocketOnConnect";

var SOCKET_UUID_PREFIX:String = "NET";
var SOCKET_UUID_SUFFIX:String = "Socket";

var SocketMap:Object = new Object();

function createSocket()
{
 var sid = SOCKET_UUID_PREFIX + UUID.getUUID() + SOCKET_UUID_SUFFIX;
  
 SocketMap[sid] = new XMLSocket();
 
 logger.debug("CreateSocket: " + sid);
 
 return sid;
}

function closeSocket(sid:String):Void
{
 var skt = SocketMap[sid];
 
 if(skt != null && (skt instanceof XMLSocket))
 {
  logger.debug("CloseSocket: " + sid);
  skt.close();
 }
}

function sendString(sid:String, src:String):Void
{
 var skt = SocketMap[sid];
 
 if(skt != null && (skt instanceof XMLSocket))
 {
  logger.debug("Send: " + src);
  skt.send(src);
 }
}

function connect(sid:String, host:String, port:Number):Boolean
{
 var skt = SocketMap[sid];
 
 var flag:Boolean = false;
 
 if(skt != null && (skt instanceof XMLSocket))
 {  
  try
  {
   flag = skt.connect(host, port);
   logger.info("->连接到: " + host + ":" + port + "flag:" + flag);
  }
  catch(e)
  {
   legger.info(e.name + ":" + e.message);
  }    
 }
 
 return false;
}

function addOnXmlEvent(sid:String)
{
 if(sid != null && sid != "")
 {
  var skt = SocketMap[sid];
 
  if(skt != null && (skt instanceof XMLSocket))
  {
   skt.onXML = function(src:String):Void
   {
    logger.debug("接收数据XML: " + src);
    
    ExternalInterface.call(onxml, sid, escape(src));
   }
  }
 }
}

function addOnDataEvent(sid:String)
{
 if(sid != null && sid != "")
 {
  var skt = SocketMap[sid];
  
  if(skt != null && (skt instanceof XMLSocket))
  {
   skt.onData = function(src:String):Void
   {
    logger.debug("接收数据TXT: " + src);
    
    ExternalInterface.call(ondata, sid, escape(src));
   }
  }
 }
}

function addOnCloseEvent(sid:String)
{
 if(sid != null && sid != "")
 {
  var skt = SocketMap[sid];
 
  if(skt != null && (skt instanceof XMLSocket))
  {
   skt.onClose = function():Void
   {
    logger.debug("Close Socket ......call: " + onclose);
    
    ExternalInterface.call(onclose, sid);
   }
  }
 }
}

function addOnConnectEvent(sid:String)
{
 if(sid != null && sid != "")
 {
  var skt = SocketMap[sid];
   
  if(skt != null && (skt instanceof XMLSocket))
  {
   skt.onConnect = function(success:Boolean):Void
   {
    logger.debug("Connect success:" + success + " ......call: " + onconnect);
    
    ExternalInterface.call(onconnect, sid, success);
   }
  }
  else
  {
   logger.debug(sid + "is NULL");
  }
 }
 else
 {
  logger.debug("addOnConnectEvent NullPointerException [sid:" + sid + "]");
 }
}

function addSocketEvent(sid:String):Void
{
 if(sid != null && sid != "")
 {
  logger.debug("addSocketEvent ......");
  
  addOnXmlEvent(sid);
  addOnDataEvent(sid);
  addOnCloseEvent(sid);
  addOnConnectEvent(sid);
 }
}

function $loadPolicyFile(uri:String):Void
{
 if(uri != null)
 {
  logger.info("加载策略文件:" + uri);
  System.security.loadPolicyFile(uri);
 }
}

function getSystemProperty(key:String):String
{
 return System.capabilities[key];
}

ExternalInterface.addCallback("setLogLevel", null, setLogLevel);

ExternalInterface.addCallback("connect", null, connect);
ExternalInterface.addCallback("closeSocket", null, closeSocket);
ExternalInterface.addCallback("createSocket", null, createSocket);

ExternalInterface.addCallback("sendString", null, sendString);

ExternalInterface.addCallback("addSocketEvent", null, addSocketEvent);

ExternalInterface.addCallback("loadPolicyFile", null, $loadPolicyFile);

ExternalInterface.addCallback("getSystemProperty", null, getSystemProperty);


编译该flash, 按下shift + F12即可。生成net.swf文件。
好了,到此为止创建socket控件的工作已经完成了,接下来就可以使用该控件与ServerSocket通信了。


原创粉丝点击