2011-09-18 4 views
1

J'écris un fichier SWF que je voudrais communiquer avec un processus Java via Sockets. Ceci est généralement assez facile avec les Sockets standard, mais pour une raison quelconque, les événements décrits dans la documentation Socket ne se déclenchent pas lorsque tous les signes indiquent qu'ils devraient l'être. Du côté Java, j'ai mis en place un ServerSocket qui écoute sur le port 8080. En utilisant netcat j'ai confirmé que cela fonctionne comme prévu.Actionscript Socket Les événements ne se déclenchent pas?

Du côté Flash, cependant, je suis la mise en place per the examples dans les docs:

public function connectToPort(port : int):void 
{ 
    m_socket = new Socket(); 

    addEventListener(Event.CLOSE, onClose); 
    addEventListener(Event.CONNECT, onConnect); 
    addEventListener(IOErrorEvent.IO_ERROR, onIoError); 
    addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); 
    addEventListener(ProgressEvent.SOCKET_DATA, onData); 

    m_socket.connect("localhost", port); 

    // trace() doens't work for the command-line :(
    m_debug.text = "Called connect!"; 
} 

Quand je lance le fichier SWF résultant, tout ce que je reçois est "appelé Connect!" sur la scène, et aucun des événements jamais allumer. Plus étrange encore, lorsque j'étudie la communication de la ServerSocket à la fin Java, elle reçoit et accepte une connexion. Lorsque je ferme le fichier SWF, le code appelant mon serveur se termine normalement, ce qui signifie qu'il est suspendu à une connexion établie avec mon fichier SWF.

Je suis parti avec quelques questions ...

  • À l'exception des gestionnaires d'événements, c'est la fin du contrôle de mon code (une fois la connexion établie, nous attendons des événements et les rendre convenablement). Est-ce que l'ensemble du programme peut se terminer, et je suis juste mal compris sur le modèle Runtime?
  • Existe-t-il des exigences de visibilité/nommage pour les rappels afin qu'ils puissent être appelés? Ils sont tous publics, mais est-ce que le Runtime ne les voit pas?
  • Y a-t-il des pièges avec la programmation AS3 Socket? J'ai continué à penser que c'était une question de sandboxing, etc., mais le SECURITY_ERROR n'a pas tiré non plus ...

Toute aide serait appréciée, j'ai passé la majeure partie de ma journée là-dessus et je suis très frustré que je ne peux pas obtenir communication de base socket pour fonctionner: -/

+0

Si cela peut aider, je fais la plupart de mon débogage dans Flash Debug Standalone Player. Quand je cours du navigateur, le côté de Java ne reçoit pas la connexion ... –

+1

Non, votre programme ne devrait pas se terminer ici, il devrait juste attendre tranquillement des événements. Non, il n'y a pas de conditions de nommage particulières. Une erreur de sécurité doit se produire si le serveur de socket ne répond pas à une réponse de fichier de stratégie sauf si le fichier SWF est approuvé. –

Répondre

2

Il semble que vous ajoutez les écouteurs d'événement à l'objet "this", pas le socket.

essayez ceci:

m_socket.addEventListener(Event.CLOSE, onClose); 
m_socket.addEventListener(Event.CONNECT, onConnect); 
m_socket.addEventListener(IOErrorEvent.IO_ERROR, onIoError); 
m_socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); 
m_socket.addEventListener(ProgressEvent.SOCKET_DATA, onData); 

Et vous devriez commencer à voir des événements de socket.

+0

C'était tout, merci Joe^_ ^ –

0

Ces lignes ajouter les écouteurs d'événement this, non m_socket

addEventListener(Event.CLOSE, onClose); 
addEventListener(Event.CONNECT, onConnect); 
addEventListener(IOErrorEvent.IO_ERROR, onIoError); 
addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); 
addEventListener(ProgressEvent.SOCKET_DATA, onData); 

Pour les ajouter à m_socket utiliser

with(m_socket) { 
    addEventListener(Event.CLOSE, onClose); 
    addEventListener(Event.CONNECT, onConnect); 
    addEventListener(IOErrorEvent.IO_ERROR, onIoError); 
    addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); 
    addEventListener(ProgressEvent.SOCKET_DATA, onData); 
} 
Questions connexes