ryeguy
ryeguy

Reputation: 66921

Flash communication with Erlang server

This is an erlang problem, it seems. I have this code to test the client sending data, written in 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();
}

Then I have this small server, written in 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.

Now, no matter what I send from the client, I ALWAYS get [<<0,0,0,4,0,0,0,32>>] as the response. I can try writing bytes to the socket directly instead of ints, and I get the same thing. I can write more or less data, same result. UTF strings same result. Even when specifying "4" as the packet header length, I just get the same consistent result of [<<0,0,0,32>>] instead. I don't understand what I'm doing wrong here.

Upvotes: 3

Views: 1647

Answers (4)

ryeguy
ryeguy

Reputation: 66921

I am about to answer my own question in case anyone wants to know the answer.

Using a packet sniffer, I was able to find out that Flash was indeed sending the wrong packet. Although I don't know the significance of what the packet data actually was, I know what the problem was. I guess it was because I opened the Flash socket and the Erlang socket on the same machine - normally this wouldn't be a problem, but I believe that since Flash doesn't have any differenciation between listening sockets and sending sockets, that it somehow clashed with the open socket on the Erlang program.

When you specify Socket(host, port) in the Flash socket, not only are you able to send data on that socket, but you can receive it too, so that seemed to be the source of the problem.

I tested running the Flash program on my laptop and the server on my PC and it worked fine.

Upvotes: 0

Gordon Guthrie
Gordon Guthrie

Reputation:

Here's an extract from our working Erlang server that connects to a Flash socket...

It is based on Klacke's chargen server example: 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.

Upvotes: 4

tonys
tonys

Reputation: 3984

Suspect its more likely a Flash problem - your Erlang server code works perfectly with a Java socket client.

Upvotes: 1

Alexey Romanov
Alexey Romanov

Reputation: 170919

Try not closing Listen before receiving data.

Upvotes: 3

Related Questions