Как я могу прочитать только одну строку данных из TCPSocket в Ruby? - PullRequest
0 голосов
/ 11 марта 2012

Я использую следующий код для подключения к сетевому сервису, который я пишу (поддержанный EventMachine), и у меня возникли некоторые трудности, возникающие в ситуации, позволяющей использовать одно сокетное соединение для выполнения нескольких команд.

#!/usr/bin/env ruby

require 'socket'

opts = {
  :address => "0.0.0.0",
  :port => 2478
}

connection = TCPSocket.open opts[:address], opts[:port]

# Get ID
connection.print "ID something"
puts connection.read

# Status
connection.print "STATUS"
puts connection.read

# Close the connection
connection.close

Вот как выглядит мой серверный EventMachine ...

module ConnectionHandler

  def receive_data data
    send_data "Some output #{data}"
  end
end

Однако мой первый скрипт ruby ​​зависает, когда он выполняет connection.read, так как я предполагаю, что он ждет ожиданиясоединение закрыто, чтобы он знал, что он получил все данные?Это не то, чего я хочу.

Мой сервер сокетов просто примет одну команду (в одну строку) и вернет одну строку вывода.

Есть идеи, как мне это сделать?Спасибо.

1 Ответ

1 голос
/ 11 марта 2012

Оказывается, метод connection.gets вернет полученную строку данных, если сервер отправит ответ, заканчивающийся символом \ n. Поэтому я просто добавил \n в конец моего send_data звонка и переключился на использование puts connection.gets, и он отлично работал!

...