Flash как шлюз для сокетов для JavaScript - PullRequest
2 голосов
/ 23 октября 2009

Я только что заполнил веб-приложение для чата, основанное на ajax / php. Но проблема с этим приложением состоит в том, что оно должно постоянно опрашивать сервер, чтобы проверять наличие новых сообщений, что, в свою очередь, перегружает сервер, если многие люди используют это приложение одновременно. Теперь я хочу реализовать приложение чата на основе сокетов в JavaScript. Я знаю, что в JavaScript нет поддержки сокетов, поэтому я решил использовать " Flash в качестве шлюза для сокетов для JavaScript ". Я использую Linux и только что начал использовать флэш. Может ли кто-нибудь помочь мне с этим?

в основном, 1) Я хочу создать небольшой SWF-объект, который просто обрабатывает логику сокета (минимальная ширина и высота, чтобы я мог легко скрыть это с -ve margin). 2) Я хочу получить доступ к этому объекту SWF с помощью JavaScript

Я получил код для простого сокета в 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?");
}

ОШИБКА IS:

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 ]

6 голосов
/ 23 октября 2009

Вы можете проверить gimite's web-socket-js . Это шлюз для сокетов, соответствующий незавершенному API веб-сокетов , поэтому в будущем, когда браузеры реализуют собственный WebSocket, он автоматически переключится на альтернативу без Flash.

0 голосов
/ 23 октября 2009

Следующий код находится за пределами блоков 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?");
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...