2010-08-12 24 views
3

我已经设置了一个简单的单服务服务器,该服务器对小测试文件一直工作得很好,但是当我尝试运行更大,更实用的文件时,出现了问题。通过Ruby的TCPServer发送较大文件的问题

发送一个5.2 MB的文件工作正常。发送一个30.3 MB文件的工作,但需要很长时间(如15分钟左右)。当发送一个38.5 MB的文件时,服务器收到它,但它会抛出错误:msconvert_server.rb:20:in 'write': Invalid argument - 179.raw (Errno::EINVAL)(179.raw是文件的名称)。

我不知道为什么会发生这种情况。 This forum似乎有答案,虽然它加快了发送和接收时间,并且也获得了传递线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 

回答

2

我找到了一个解决问题的办法。通过从a previous question应用相同的解决方案,我改变了代码如下:

服务器: 需要 '插座'

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 

似乎扩大IO单线程解决了我的大部分Ruby文件问题。