2012-03-17 62 views
0

你能幫我嗎?我有一個與gen_tcp發送函數有關的問題。我一直試圖從我的erlang服務器向我的flash客戶端發送幾個元組,大約10-15個元素,這些元組被解碼爲amf對象。erlang gen_tcp發送問題

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

沒有錯誤,但Flash客戶端沒有收到整個數據只是約8-11項。套接字選項是[二進制,{active,true},{reuseaddr,true}]。我檢查了我的網絡,我使用客戶端 - 發送的數據包被分成兩個片段,大大小小。大的一個是數據包的第一個片段,而下一個是小數據包。 bigs的數量與發送的消息數量相同,但小數量少於flash客戶端收到的消息數量。

它只會再現,如果我發送數據的速度很快,如果我慢慢做它似乎確定。有誰知道它爲什麼會發生?這將是非常有益的。

+0

您是什麼意思「我發送數據快」?是否有可能用完緩衝存儲器並丟棄包?你確定你在另一端正確地讀取數據嗎? wireshark展示了什麼? – 2012-03-19 08:57:23

回答

0
  1. 我沒試過AMF,但我用二郎+閃光燈和JSON,而不是AMF插座的
  2. 什麼包選項? (例如,我使用{packet,2})
  3. 您是如何讀取客戶端數據的?也許你沒有讀完所有的數據並且沒有提出新的事件?
0

我的猜測是這是一個框架問題。

TCP是一種流媒體協議,因此,當您在閃存中閱讀時,並不保證立即獲取所有消息。相反,您需要某種框架設置,例如{packet, 2}{packet, 4}上的套接字選項。這有效地將TCP從流協議轉換爲消息傳遞協議。我想你想要後者。

0

我認爲你可以這樣做: 1發送味精(你的元組),使用term_to_binary(MSG),以獲得二進制之前,那麼的sizeof二進制,那麼,在您的客戶端收到味精,用binary_to_term得到的元組。 2您需要設置套接字選項{packet,2或4}的客戶端和服務器