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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top