2009-01-04 5 views
3

Il s'agit d'un problème erlang, semble-t-il. J'ai ce code pour tester l'envoi de données client, écrit en Actionscript 3:Communication flash avec le serveur Erlang

var socket:Socket=new Socket("localhost", 2345); 
socket.addEventListener(Event.CONNECT, connected); 

private function connected(event:Event):void { 
    socket.writeInt(12); //packet length, should be correct? 4 bytes each? 
    socket.writeInt(3); 
    socket.writeInt(6); 
    socket.writeInt(9); 
    socket.flush(); 
} 

J'ai ce petit serveur, écrit en Erlang:

start_nano_server() -> 
    {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 0}, 
        {reuseaddr, true}, 
        {active, true}, 
        {packet_size, 128}]), 
    {ok, Socket} = gen_tcp:accept(Listen), 
    gen_tcp:close(Listen), 
    receive_data(Socket, []). 

receive_data(Socket, SoFar) -> 
    receive 
    {tcp,Socket,Bin} -> 
     receive_data(Socket, [Bin|SoFar]); 
    {tcp_closed,Socket} -> 
     Bytes=list_to_binary(reverse(SoFar)), 
     io:format("~p~n",[Bytes]) 
    end. 

Maintenant, peu importe ce que j'envoie de la client, je reçois TOUJOURS [<<0,0,0,4,0,0,0,32>>] comme réponse. Je peux essayer d'écrire des octets sur le socket directement au lieu de ints, et je reçois la même chose. Je peux écrire plus ou moins de données, même résultat. Chaînes UTF même résultat. Même en spécifiant "4" comme longueur d'en-tête de paquet, j'obtiens juste le même résultat cohérent de [<<0,0,0,32>>] à la place. Je ne comprends pas ce que je fais mal ici.

Répondre

0

Je suis sur le point de répondre à ma propre question au cas où quelqu'un veut connaître la réponse. En utilisant un renifleur de paquets, j'ai pu constater que Flash envoyait en effet le mauvais paquet. Bien que je ne sois pas au courant de ce que sont réellement les données par paquets, je sais quel était le problème. Je suppose que c'est parce que j'ai ouvert le socket Flash et le socket Erlang sur la même machine - normalement ce ne serait pas un problème, mais je crois que Flash n'a aucune différence entre les sockets d'écoute et les sockets d'envoi, heurté avec la prise ouverte sur le programme Erlang. Lorsque vous spécifiez Socket (hôte, port) dans le socket Flash, non seulement vous pouvez envoyer des données sur ce socket, mais vous pouvez également le recevoir, ce qui semble être la source du problème.

J'ai testé l'exécution du programme Flash sur mon ordinateur portable et le serveur sur mon PC et cela a fonctionné correctement.

3

Essayez de ne pas fermer Listen avant de recevoir des données.

1

Suspectez le plus probable un problème de Flash - votre code de serveur Erlang fonctionne parfaitement avec un client de socket Java.

4

Voici un extrait de notre serveur Erlang de travail qui se connecte à une prise Flash ...

Il est basé sur l'exemple du serveur chargen de Klacke: http://erlang.org/examples/klacke_examples/chargen.erl

-module(remoting_soc). 

-export([accept/1]). 

accept(Listen) -> 

    {ok, Soc} = gen_tcp:accept(Listen), 
    Pid = spawn(fun() -> loop(Soc) end), 
    gen_tcp:controlling_process(Soc,Pid), 
    %% Start Listening for another connection 
    remoting_soc:accept(Listen). 

loop(Socket)-> 

    receive 

     {tcp, Socket,"register"++Rest} -> 
      ...do stuff... 
      loop(Socket); 

    end. 
Questions connexes