我已经设置了一个简单的单服务服务器,该服务器对小测试文件一直工作得很好,但是当我尝试运行更大,更实用的文件时,出现了问题。通过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