erlang gen_tcp发送问题

时间:2012-03-17 12:39:42

标签: erlang gen-tcp

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

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的数量与发送的消息数量相同,但是小的数量要少得多,并且闪存客户端收到的消息数量也很少。

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

3 个答案:

答案 0 :(得分:0)

  1. 我没试过amf,但我使用的是erlang + flash和json而不是amf
  2. socket的什么包选项? (我使用{packet,2},例如)
  3. 您是如何在客户端读取数据的?也许您没有阅读所有数据以结束并且没有新事件被提出?

答案 1 :(得分:0)

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

TCP是一种流媒体协议,因此当您在Flash中阅读时,您无法立即获得所有消息。相反,你需要某种框架设置,比如套接字选项上的{packet, 2}{packet, 4}。这有效地将TCP从流协议转变为消息传递协议。我想你想要后者。

答案 2 :(得分:0)

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