【问题标题】:Flash as a socket gateway for javascriptFlash 作为 javascript 的套接字网关
【发布时间】:2010-12-09 09:46:50
【问题描述】:

我刚刚完成了一个基于 ajax/php 的基于网络的聊天应用程序。但是这个应用程序的问题是它必须不断地轮询服务器来检查新消息,如果很多人同时使用这个应用程序,这反过来又会使服务器过载。 现在我想在 JavaScript 中实现一个基于套接字的聊天应用程序。我知道 JavaScript 中不支持套接字,所以我决定使用“Flash 作为 JavaScript 的套接字网关”我正在使用 Linux 并且是 Flash 新手。有人可以帮助我如何实现这一目标。

基本上, 1)我想制作一个只处理套接字逻辑的小型 SWF 对象(最小宽度和高度,因此我可以使用 -ve 边距轻松隐藏它。 2) 我想用 JavaScript 访问这个 swf 对象

我在 actionscript 中获得了一个简单套接字的代码(来自互联网),但我无法使用 mxmlc(免费 flash 编译器)对其进行编译。 这是代码...

    myXML = new XMLSocket; 
    myXML.onConnect = handleConnect; 
    myXML.onXML = handleXML; 
    myXML.onClose = handleDisconnect; 
    myXML.connect("http://www.yourServer.com", 12345); 
    function handleConnect(connectionStatus){
    connectionStatus ? trace("Connected.") : trace("Connection failed.");
    }
    function handleXML(xmlObject){
    trace("Object recieved:: "+xmlObject);
    }
function sendXML(textToSend){
myXML.send(new XML('"+textToSend+""));
}
function handleDisconnect(){
trace("Connection lost.");
}
function closeConnection(){
trace("Closing connection to server.");
myXML.close();
}

我得到了更好的代码,但这也无法编译

package
{
import flash.errors.*;
import flash.events.*;
import flash.net.Socket;

public class ChatSocket extends Socket
{
  public var host:String;
  public var port:uint;
  private var socket:Socket;
  public static var SOCK_CONNECTED:String = "onSockConnect";
  public static var SOCK_IOERROR:String = "onSockIOError";

  function ChatSocket(h:String, p:uint)
  {
    host = h;
    port = p;
    socket = this;
    super(host, port);
    initListeners();
  }
  public function sendMessage(str:String):void
  {
    if(connected)
    {
      socket.writeUTFBytes(str + "\n");
    }
    else
    {
      trace("Not connected, message not sent!");
    }
  }
  public function readMessage():void
  {
    if(connected)
    {
      var str:String = socket.readUTFBytes(socket.bytesAvailable);
      trace("Socket Server Response: " + str);
    }
     else
     {
       trace("No message read, not connected!");
     }
  }
  private function initListeners():void
  {
     socket.addEventListener(Event.CLOSE, closeHandler);
     socket.addEventListener(Event.CONNECT, connectHandler);
     socket.addEventListener(IOErrorEvent.IO_ERROR,
    ioErrorHandler);
  }
  private function closeHandler(event:Event):void
  {
     trace("Connection to [" + host + "] closed");
  }
  private function ioErrorHandler(event:IOErrorEvent):void
  {
     dispatchEvent(new Event(SOCK_IOERROR));
  }
  private function connectHandler(event:Event):void
  {
     trace("Connected to [" + host + "]");
     dispatchEvent(new Event(SOCK_CONNECTED));
  }
  private function socketDataHandler(event:ProgressEvent):void
  {
     readMessage();
  }
}

}

var sock:ChatSocket;
sock = new ChatSocket('127.0.0.1', 9990);
sock.addEventListener(ChatSocket.SOCK_CONNECTED, connected);
sock.addEventListener(ChatSocket.SOCK_IOERROR, ioError);
function ioError(e:Event):void
{
  trace("Cant connect to " + sock.host + " on port " + sock.port);
}
function connected(e:Event):void
{
  sock.sendMessage("are you hungry?");
}

错误是:

localhost bin]$ ./mxmlc ChatSocket.as
Loading configuration file /home/lk/Documents/flex_sdk_3.4/frameworks/flex-config.xml
/home/lk/Documents/flex_sdk_3.4/bin/ChatSocket.as: Error: A file found in a source-path can not have more than one externally visible definition. ChatSocket;sock;ioError;connected

【问题讨论】:

  • 编译器会给你哪个错误?
  • [lk@localhost bin]$ ./mxmlc FilledCircle.as 加载配置文件 /home/lk/Documents/flex_sdk_3.4/frameworks/flex-config.xml /home/lk/Documents/flex_sdk_3 .4/bin/FilledCircle.swf (661 bytes) [lk@localhost bin]$ ./mxmlc try.as 加载配置文件 /home/lk/Documents/flex_sdk_3.4/frameworks/flex-config.xml /home/lk /Documents/flex_sdk_3.4/bin/try.as(13): col: 20 错误:语法错误:字符串文字必须在换行之前终止。
  • myXML.send(new XML('"+textToSend+"")); ^ /home/lk/Documents/flex_sdk_3.4/bin/try.as(21): col: 1 错误:语法错误:程序结束前需要标识符。} ^ /home/lk/Documents/flex_sdk_3.4/bin/try.as(21): col: 1 错误:语法错误:程序结束前需要 rightparen。} ^ / home/lk/Documents/flex_sdk_3.4/bin/try.as(21): col: 1 Error: Syntax error: Expecting rightparen before the end of program. } ^ /home/lk/Documents/flex_sdk_3.4/bin/try .as(21): col: 1 错误:语法错误:程序结束前需要右括号。} ^

标签: javascript flash sockets


【解决方案1】:

您不妨查看 gimite 的web-socket-js。这是一个符合工作中Web Socket API 的套接字网关,因此将来随着浏览器实现本机 WebSocket,它将自动切换到无 Flash 替代方案。

【讨论】:

  • 这正是我想要的。谢谢!
【解决方案2】:

以下代码位于 classpackage {} 块之外。这是不允许的。

var sock:ChatSocket;
sock = new ChatSocket('127.0.0.1', 9990);
sock.addEventListener(ChatSocket.SOCK_CONNECTED, connected);
sock.addEventListener(ChatSocket.SOCK_IOERROR, ioError);
function ioError(e:Event):void
{
  trace("Cant connect to " + sock.host + " on port " + sock.port);
}
function connected(e:Event):void
{
  sock.sendMessage("are you hungry?");
}

声明一个文档类(扩展Sprite)并将ioErrorconnected 方法移至它。将 sock 设为实例变量而不是局部变量,并将 sock 的声明部分添加到其构造函数中。

//DocClass.as
package
{
  public class DocClass
  {
    private var sock:ChatSocket;
    public function DocClass()
    {
      sock = new ChatSocket('127.0.0.1', 9990);
      sock.addEventListener(ChatSocket.SOCK_CONNECTED, connected);
      sock.addEventListener(ChatSocket.SOCK_IOERROR, ioError);
    }
    private function ioError(e:Event):void
    {
      trace("Cant connect to " + sock.host + " on port " + sock.port);
    }
    private function connected(e:Event):void
    {
      sock.sendMessage("are you hungry?");
    }
  }
}

【讨论】:

  • 感谢您的帮助...您能告诉我是否可以创建一个仅处理套接字逻辑的小型 swf(不会在前端显示)文件,我可以使用它访问它吗javascript ...在此先感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 2011-06-09
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多