1

请你帮助我好吗?我有一个与 gen_tcp 发送功能有关的问题。我一直在尝试从我的 erlang 服务器向我的 flash 客户端发送一些元组,大约 10-15 个项目,这些元组被解码为 amf 对象。

case get_tcp:send(Socket, Msg) of
ok -> io:format("sent~n");
{erorr, Err} -> io:format("~w~n", [Err])
end

没有错误,但 Flash 客户端仅接收到大约 8-11 项的全部数据。套接字选项是 [binary, {active, true}, {reuseaddr, true}]。我检查了我使用客户端的网络 - 发送的数据包被分成两个片段,大的和小的。大的是数据包的第一个片段,而小的是下一个。bigs 的数量与发送的消息数量相同,但 smalls 的数量要少得多,大约是 flash 客户端接收到的消息数量。

只有当我快速发送数据时它才会重现,如果我慢慢发送数据似乎没问题。有谁知道为什么会这样?这将非常有帮助。

4

3 回答 3

1

我的猜测是,这是一个框架问题。

TCP 是一种流式协议,因此当您在 flash 中读取时,不能保证立即获得所有消息。相反,您需要某种框架设置,例如{packet, 2}套接字{packet, 4}选项。这有效地将 TCP 从流协议转换为消息协议。我认为你想要后者。

于 2012-03-19T14:56:29.623 回答
1

我认为您可以这样做: 1 在发送 msg(您的元组)之前,使用 term_to_binary(Msg) 获取二进制文件,然后使用 sizeof 二进制文件,然后,在您的客户端收到 msg 后,使用 binary_to_term 获取元组。2 客户端和服务器都需要设置socket选项{packet, 2 or 4}

于 2012-03-21T03:49:59.597 回答
0
  1. 我没试过amf,但我用erlang+flash和json代替amf
  2. 套接字的什么数据包选项?(例如,我使用 {packet, 2})
  3. 你是如何在客户端读取数据的?也许您没有读取所有数据以结束并且没有引发新事件?
于 2012-03-17T16:39:53.727 回答