代码之家  ›  专栏  ›  技术社区  ›  Pragati Sureka

Flash作为JavaScript的套接字网关

  •  2
  • Pragati Sureka  · 技术社区  · 16 年前

    我刚刚完成了一个基于Ajax/PHP的基于Web的聊天应用程序。但这个应用程序的问题是,它必须不断地轮询服务器以检查新消息,如果许多人同时使用这个应用程序,这反过来又会使服务器过载。 现在我想用JavaScript实现一个基于套接字的聊天应用程序。我知道JavaScript中不支持套接字,所以我决定使用“ Flash作为JavaScript的套接字网关 “我使用的是Linux和Flash。有人能帮我解决这个问题吗?

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

    我在actionscript(从Internet)中得到了一个简单套接字的代码,但我无法使用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
    
    2 回复  |  直到 16 年前
        1
  •  6
  •   bobince    16 年前

    你可以去看看Gimite的 web-socket-js . 这是一个符合正在进行的工作的套接字网关 Web Socket API 因此,在将来,当浏览器实现本机WebSocket时,它将自动切换到无闪存选项。

        2
  •  0
  •   Amarghosh    16 年前

    以下代码位于 class 和 package {} 阻碍。这是不允许的。

    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 然后移动 ioError 和 connected 方法。使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?");
        }
      }
    }