代码之家  ›  专栏  ›  技术社区  ›  ryeguy

与Erlang服务器的闪存通信

  •  3
  • ryeguy  · 技术社区  · 16 年前

    这似乎是一个二郎问题。我有这个代码来测试发送数据的客户端,用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>>] 作为回应。我可以尝试将字节直接写入套接字,而不是Ints,我得到了同样的结果。我可以写或多或少的数据,同样的结果。UTF字符串的结果相同。即使将“4”指定为数据包头长度,我也只能得到 [<<0,0,0,32>>] 相反。我不明白我在这里做错了什么。

    4 回复  |  直到 14 年前
        1
  •  4
  •   Gordon Guthrie    16 年前

    这是我们的Erlang服务器的一个摘录,它连接到一个闪存插座…

    它基于Klacke的Chargen服务器示例: 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.
    
        2
  •  3
  •   Alexey Romanov    16 年前

    尝试不关闭 Listen 在接收数据之前。

        3
  •  1
  •   tonys    16 年前

    怀疑它更可能是一个闪存问题-你的Erlang服务器代码与Java套接字客户端完美地结合在一起。

        4
  •  0
  •   ryeguy    16 年前

    我要回答我自己的问题,以防有人想知道答案。

    通过使用包嗅探器,我发现flash确实发送了错误的包。虽然我不知道包数据实际上是什么的重要性,但我知道问题出在哪里。我想是因为我在同一台机器上打开了flash socket和erlang socket——通常这不会是问题,但我相信既然flash在监听套接字和发送套接字之间没有任何区别,它会与erlang程序上的open socket发生冲突。

    当您在flash套接字中指定socket(主机、端口)时,不仅可以在该套接字上发送数据,而且还可以接收数据,所以这似乎是问题的根源。

    我测试了在我的笔记本电脑和电脑上的服务器上运行flash程序,它运行得很好。