comunicação flash com servidor Erlang
-
03-07-2019 - |
Pergunta
Este é um problema erlang, parece. Eu tenho esse código para testar o cliente enviar dados, escrito em 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();
}
Então eu tenho este pequeno servidor, escrito em 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.
Agora, não importa o que eu enviar a partir do cliente, eu sempre chegar [<<0,0,0,4,0,0,0,32>>]
como a resposta. Eu posso tentar escrever bytes para o socket diretamente em vez de ints, e eu recebo a mesma coisa. Eu posso escrever mais ou menos dados, mesmo resultado. mesmo resultado UTF cordas. Mesmo quando se especifica "4" como o comprimento cabeçalho do pacote, eu apenas obter o mesmo resultado consistente de [<<0,0,0,32>>]
vez. Eu não entendo o que estou fazendo de errado aqui.
Solução 4
Eu estou a ponto de responder a minha própria pergunta no caso de alguém quiser saber a resposta.
Usando um sniffer de pacotes, eu era capaz de descobrir que o Flash estava realmente enviar o pacote errado. Embora eu não sei o significado do que o de pacote de dados realmente foi, eu sei qual era o problema. Acho que foi porque eu abri a tomada Flash e tomada de Erlang na mesma máquina - normalmente isso não seria um problema, mas eu acredito que desde que o Flash não tem qualquer diferenciação entre ouvir soquetes e enviar soquetes, que de alguma forma entraram em confronto com o soquete aberto sobre o programa Erlang.
Quando você especifica Socket (host, port) no soquete do Flash, não só você é capaz de enviar dados sobre esse socket, mas você pode recebê-lo também, para que parecia ser a fonte do problema.
Eu testei a execução do programa em Flash no meu laptop e o servidor no meu PC e ele funcionou bem.
Outras dicas
Aqui está um extrato do nosso servidor Erlang de trabalho que se conecta a um flash tomada ...
É baseado no exemplo de servidor 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.
Tente não fechar Listen
antes de receber dados.
Suspeito seu mais provável um problema Flash -. Seu código de servidor Erlang funciona perfeitamente com um cliente de soquete Java