2015-10-06 3 views
0

Я использую Faye и EventMachine для открытия сокета на другом сервере. Сервер отключается, если он не обнаруживает активность. Как отправить файл (двоичный код), чтобы сервер не тайм-аут?Отправка большого файла в websocket до таймаута

Вот что у меня есть:

media_path = "/path/to/media/file" 

EM.run { 
    ws = Faye::WebSocket::Client.new(uri) 

    ws.on :open do |event| 
    puts "Opening socket" 
    ws.send(File.read(media_path)) 
    end 

    ws.on :message do |event| 
    puts "Recieving message" 
    end 

    ws.on :close do |event| 
    ws = nil 
    EM.stop 
    end 
} 

ответ

1

Вы должны send your file in batches. Нечто подобное:

ws.on :open do |event| 
    puts "Opening socket" 
    File.open('filename','r') do |f| 
    ws.send(f.gets) 
    end 
end 

Вы решить другую проблему таким образом: вы бы не поместить весь файл в памяти + вы будете отправить его быстрее. Вы можете прочитать о nodejs streams, есть аналогичный принцип работы.

+0

получает может получить непоследовательные размеры данных. Рассмотрите возможность использования 'f.read 65_536' - 64 КБ (2 ** 16) - это достойный размер пакета, но вы, вероятно, должны измениться в соответствии с вашими обстоятельствами. – Myst

+0

P.S. Вы отправляете только первую строку. Рассмотрим добавление 'до f.eof?' – Myst

1

Это несколько дубликата для How to send binary file over Web Sockets with Rails Хотя этот вопрос пришел первый ...

Пожалуйста, смотрите мой ответ на этот вопрос для другого варианта, который не будет блокировать приложения в то время как вы отправляете файл.

Смежные вопросы