Флэш-связь с сервером Erlang - PullRequest
3 голосов
/ 05 января 2009

Кажется, это проблема Эрланга. У меня есть этот код для проверки клиента, отправляющего данные, написанный в Actionscript 3:

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();
}

Тогда у меня есть этот маленький сервер, написанный на 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.

Теперь, что бы я ни отправлял от клиента, я ВСЕГДА получаю [<<0,0,0,4,0,0,0,32>>] в качестве ответа. Я могу попробовать записать байты в сокет напрямую вместо целых, и я получаю то же самое. Я могу написать больше или меньше данных, тот же результат. UTF строки тот же результат. Даже при указании «4» в качестве длины заголовка пакета я просто получаю тот же непротиворечивый результат [<<0,0,0,32>>]. Я не понимаю, что я делаю здесь не так.

Ответы [ 4 ]

4 голосов
/ 05 января 2009

Вот выдержка из нашего рабочего сервера Erlang, который подключается к флеш-сокету ...

Он основан на примере сервера 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.
3 голосов
/ 05 января 2009

Старайтесь не закрывать Listen до получения данных.

1 голос
/ 05 января 2009

Подозреваю, что это скорее проблема Flash - ваш код сервера Erlang прекрасно работает с клиентом Java-сокета.

0 голосов
/ 05 января 2009

Я собираюсь ответить на свой вопрос, если кто-то захочет узнать ответ.

Используя анализатор пакетов, я смог обнаружить, что Flash действительно отправлял неправильный пакет. Хотя я не знаю, насколько важны были пакетные данные, я знаю, в чем проблема. Я думаю, это потому, что я открыл флеш-сокет и эрланг-сокет на одной и той же машине - обычно это не было бы проблемой, но я считаю, что поскольку у Flash нет различий между прослушивающими и отправляющими сокетами, это как-то Столкнулся с открытым сокетом в программе Erlang.

Когда вы указываете Socket (хост, порт) во флеш-сокете, вы не только можете отправлять данные в этот сокет, но вы также можете получать их, так что казалось, что это источник проблемы.

Я протестировал запуск программы Flash на моем ноутбуке и сервера на моем компьютере, и он работал нормально.

...