J'ai configuré un serveur simple à service unique qui fonctionne parfaitement avec les petits fichiers de test, mais lorsque j'ai essayé d'exécuter des fichiers plus volumineux et plus pratiques, les choses se passent mal.Problèmes lors de l'envoi de fichiers volumineux sur le serveur TCPS de Ruby
L'envoi d'un fichier de 5,2 Mo fonctionne correctement. Envoyer un fichier de 30,3 Mo fonctionne, mais prend beaucoup de temps (comme 15 minutes environ). Lors de l'envoi d'un fichier de 38,5 Mo, le serveur le reçoit, mais il renvoie l'erreur suivante: msconvert_server.rb:20:in 'write': Invalid argument - 179.raw (Errno::EINVAL)
(179.raw étant le nom du fichier).
Je n'arrive pas à comprendre pourquoi cela se produit. This forum semblait avoir la réponse, et bien que cela ait accéléré l'envoi et le temps de réception et obtenu la ligne de passage 20, il a échoué à un autre moment. Je ne crois pas que TCP a une limite de taille de fichier, ce qui me porte à croire que le problème réside dans le code Ruby. Quelqu'un a-t-il déjà vu ce problème ou a-t-il une idée de ce qui pourrait se passer ici?
Voici le code.
serveur:
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
}
client:
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