与Erlang服务器进行Flash通信

3

这似乎是一个Erlang问题。我有这段代码来测试客户端发送数据,它是用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字符串也是如此。即使指定“4”作为数据包头长度,我仍然只得到[<<0,0,0,32>>]这个一致的结果。我不明白我在这里做错了什么。
4个回答

4
这是我们正在使用的Erlang服务器连接Flash套接字的代码片段,基于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.

3

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


1

我怀疑这更可能是Flash的问题 - 你的Erlang服务器代码与Java套接字客户端完美地配合。


0

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

通过使用数据包嗅探器,我能够发现Flash确实发送了错误的数据包。虽然我不知道数据包实际上是什么意义,但我知道问题所在。我猜这是因为我在同一台机器上打开了Flash套接字和Erlang套接字 - 通常这不会是一个问题,但我相信由于Flash没有区分监听套接字和发送套接字,它与Erlang程序上的打开套接字发生了冲突。

当您在Flash套接字中指定Socket(host,port)时,不仅可以在该套接字上发送数据,还可以接收数据,因此这似乎是问题的根源。

我测试了在我的笔记本电脑上运行Flash程序,在我的PC上运行服务器,它可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接