erlang gen_tcp отправить вопрос - PullRequest
0 голосов
/ 17 марта 2012

Не могли бы вы помочь мне? У меня проблема, связанная с функцией отправки 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

Нет ошибок, но флеш-клиент не получает целые данные только из 8-11 элементов. Параметры сокета: [двоичный, {активный, true}, {reuseaddr, true}]. Я проверил свою сеть, где я использую клиент - отправленные пакеты были фрагментированы на два фрагмента, большой и маленький. Большой - это первый фрагмент пакета, а маленький - следующий. Количество больших значений совпадает с количеством отправленных сообщений, но меньшее намного меньше, и количество полученных сообщений от клиента Flash.

Воспроизводится только в том случае, если я отправляю данные быстро, если я делаю это медленно, это выглядит нормально. Кто-нибудь знает, почему это происходит? Это будет очень полезно.

Ответы [ 3 ]

0 голосов
/ 19 марта 2012

Я предполагаю, что это проблема кадрирования.

TCP - это потоковый протокол, поэтому при чтении во флэш-памяти вы не гарантированно получите все сообщения сразу.Скорее вам нужна какая-то настройка кадрирования, скажем {packet, 2} или {packet, 4} для опций сокетов.Это эффективно превращает TCP из потокового протокола в протокол обмена сообщениями.И я думаю, что вы хотите последнее.

0 голосов
/ 21 марта 2012

Я думаю, что вы можете сделать так: 1 Перед отправкой msg (ваш кортеж), используйте term_to_binary (Msg), чтобы получить двоичный файл, затем размер двоичного файла, затем, после того как ваш клиент получит сообщение, используйте binary_to_term для получения кортежа.2 И клиенту, и серверу вам нужно установить опцию сокета {пакет, 2 или 4}

0 голосов
/ 17 марта 2012
  1. Я не пробовал amf, но вместо amf я использую erlang + flash и json
  2. Какой пакетный вариант сокета? (Я использую {пакет, 2}, например)
  3. Как вы читали данные на стороне клиента? Может быть, вы не прочитали все данные до конца и никаких новых событий не возникло?
...