Problems sending large files through Ruby TCPServer

I created a simple server with one service that works fine with small test files, but when I tried to run larger and more practical files, everything went wrong.

Sending a file with 5.2 MB works fine. Sending a file with 30.3 MB works, but takes a lot of time (about 15 minutes or so). When sending a 38.5 MB file, the server receives it, but then it gives an error: msconvert_server.rb:20:in 'write': Invalid argument - 179.raw (Errno::EINVAL)(179.raw is the name of the file).

I do not understand why this is happening. This forum seemed to have an answer, and although it accelerated the time of sending and receiving, and also received line 20, it did not work out another point. I don’t think TCP has a file size limit, which makes me think that the problem lies in the Ruby code. Has anyone seen this problem or had an idea of ​​what could be happening here?

Here is the code.

Server

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 lame to have a script run a script, but it 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
+3
source share
1 answer

I found a solution to the problem. Applying the same solution from the previous question , I changed the code to this:

Server : Socket Required

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 lame to have a script run a script, but it 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

, IO- Ruby.

+2

Source: https://habr.com/ru/post/1759402/


All Articles