Я настроил простой сервер с одним сервисом, который прекрасно работал с небольшими тестовыми файлами, но когда я попытался запустить большие, более практичные файлы, все пошло не так.
Отправка файла 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