erlang gen_tcp发送问题



你能帮我吗?我遇到了一个与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

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

只有当我快速发送数据时,它才会复制,如果我发送得慢,它似乎还可以。有人知道为什么会发生这种情况吗?这将非常有帮助。

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

TCP是一种流协议,所以当你在flash中阅读时,不能保证你能立即收到所有消息。相反,您需要某种框架设置,比如套接字选项上的{packet, 2}{packet, 4}。这有效地将TCP从流协议转变为消息传递协议。我想你想要后者。

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

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

最新更新