Проблемы с отправкой больших файлов через TCPServer Руби - PullRequest
3 голосов
/ 12 августа 2010

Я настроил простой сервер с одним сервисом, который прекрасно работал с небольшими тестовыми файлами, но когда я попытался запустить большие, более практичные файлы, все пошло не так.

Отправка файла 5,2 МБ работает нормально. Отправка файла 30,3 МБ работает, но занимает много времени (примерно 15 минут или около того). При отправке файла размером 38,5 МБ сервер получает его, но затем выдает ошибку: msconvert_server.rb:20:in 'write': Invalid argument - 179.raw (Errno::EINVAL) (179.raw - имя файла).

Я в недоумении, почему это происходит. Этот форум , казалось, имел ответ, и, хотя он ускорил время отправки и получения, а также получил пропускную линию 20, он потерпел неудачу в другой точке. Я не верю, что в TCP есть какие-либо ограничения на размер файла, что приводит меня к мысли, что проблема заключается в коде Ruby. Кто-нибудь видел эту проблему, или есть представление о том, что здесь может происходить?

Вот код.

Сервер

require 'socket'

server = TCPServer.open(2000)
loop {
  client = server.accept

  filename = client.gets.chomp

  puts "Reading contents of #{filename}.raw"
  raw_data = client.gets("\r\r\n\n").chomp("\r\r\n\n")

  (Line 20, where error occurs) File.open(filename + ".raw", 'wb') {|out| out.print raw_data}

  puts "Converting #{filename}"

  #It's lame to have a script run a script, but it's the only way to get this to work.
  system "scriptit.bat " + filename + ".raw"

  puts "Sending contents of #{filename}.mzML"
  client.print IO.read(filename + ".mzML")
  client.print "\r\r\n\n"
  puts "Done"
  client.close
}

Клиент

    host = config_value("//Host/@ip")
    port = 2000

    client = TCPSocket.open(host, port)

    fileName = @file.split("/")[-1].chomp(File.extname(@file))

    puts "Sending raw file"
    client.puts fileName
    client.print(File.open("#{@file}", "rb") {|io| io.read})
    client.print("\r\r\n\n")  #This is the delimiter for the server

    puts "Receiving mzML file"
    File.open("#{$path}../data/spectra/#{fileName}.mzML", 'wb') {|io| io.print client.gets("\r\r\n\n")}
    client.close

1 Ответ

2 голосов
/ 17 августа 2010

Я нашел решение проблемы.Применяя то же решение из предыдущего вопроса , я изменил код так:

Сервер : требуется 'socket'

server = TCPServer.open(2000)
loop {
  client = server.accept

  filename = client.gets.chomp

  puts "Reading contents of #{filename}.raw"
  raw_data = client.gets("\r\r\n\n").chomp("\r\r\n\n")
  file = File.open(filename + ".raw", 'wb')
  file.print raw_data
  file.close

  puts "Converting #{filename}"
  #It's lame to have a script run a script, but it's the only way to get this to work.
  system "scriptit.bat " + filename + ".raw"

  puts "Sending contents of #{filename}.mzML"
  data = IO.read(filename + ".mzML")
  client.print data
  client.print "\r\r\n\n"

  puts "Done"
  client.close
}

Клиент :

host = config_value("//Host/@ip")
port = 2000

client = TCPSocket.open(host, port)

fileName = @file.split("/")[-1].chomp(File.extname(@file))

puts "Sending raw file"
client.puts fileName
data = IO.read("#{@file}")
client.print data
client.print "\r\r\n\n"  #This is the delimiter for the server

puts "Receiving mzML file"
file = File.open("#{$path}../data/spectra/#{fileName}.mzML", 'wb')
data = client.gets("\r\r\n\n")
file.print data

client.close

Кажется, что расширение однострочных операций ввода-вывода решает большинство моих больших проблем с Ruby в файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...