Флэш-связь с сервером Erlang
-
03-07-2019 - |
Вопрос
Кажется, это проблема Эрланга. У меня есть этот код для проверки клиента, отправляющего данные, написанный в 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 строки тот же результат. Даже при указании & Quot; 4 & Quot; в качестве длины заголовка пакета вместо этого я получаю тот же непротиворечивый результат [<<0,0,0,32>>]
. Я не понимаю, что я делаю здесь не так.
Решение 4
Я собираюсь ответить на свой вопрос, если кто-то захочет узнать ответ.
Используя анализатор пакетов, я смог обнаружить, что Flash действительно отправлял неправильный пакет. Хотя я не знаю, насколько важны были пакетные данные, я знаю, в чем проблема. Я думаю, это потому, что я открыл флеш-сокет и эрланг-сокет на одной и той же машине - обычно это не было бы проблемой, но я считаю, что поскольку у Flash нет различий между прослушивающими и отправляющими сокетами, это как-то конфликтует с открытым сокетом в программе Erlang.
Когда вы указываете Socket (хост, порт) во флеш-сокете, вы можете не только отправлять данные в этот сокет, но и получать их, так что это, похоже, является источником проблемы.
Я протестировал запуск программы Flash на моем ноутбуке и на сервере на моем компьютере, и она работала нормально. Р>
Другие советы
Вот выдержка из нашего рабочего сервера Erlang, который подключается к гнезду Flash ...
Он основан на примере сервера 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.
Не закрывайте Listen
до получения данных.
Подозреваю, что это скорее проблема Flash - ваш код сервера Erlang отлично работает с клиентом Java-сокета.