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 回答 4

4

这是连接到 Flash 套接字的工作 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.
于 2009-01-05T16:00:00.987 回答
3

Listen接收数据前尽量不要关闭。

于 2009-01-05T14:11:44.450 回答
1

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

于 2009-01-05T15:02:13.507 回答
0

如果有人想知道答案,我将回答我自己的问题。

使用数据包嗅探器,我能够发现 Flash 确实发送了错误的数据包。虽然我不知道数据包数据的实际意义,但我知道问题出在哪里。我想这是因为我在同一台机器上打开了 Flash 套接字和 Erlang 套接字——通常这不会是一个问题,但我相信由于 Flash 在侦听套接字和发送套接字之间没有任何区别,所以它不知何故与 Erlang 程序上的打开套接字发生冲突。

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

我测试了在我的笔记本电脑上运行 Flash 程序并在我的 PC 上运行服务器,它运行良好。

于 2009-01-05T20:50:32.523 回答