2010-08-12 8 views
3

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 

Répondre

2

J'ai trouvé une solution au problème. En appliquant la même solution de a previous question, j'ai changé le code à ceci:

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") 
    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 
} 

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 
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 

Il semble que l'expansion IO one-liners résout la plupart de mes problèmes de fichiers Ruby.