Отправка сообщения сокета с помощью ruby ​​без закрытия соединения - PullRequest
4 голосов
/ 01 августа 2011

Я работаю над небольшим клиентом ruby, который отправляет непрерывный поток информации на сервер сокетов (который затем передается другим прослушивающим клиентам). Я не хочу закрывать соединение каждый раз, когда отправляются данные, однако кажется, что с ruby ​​данные не отправляются, пока я не закрою соединение. Есть ли другой способ сделать это без повторного подключения к серверу? Важно, чтобы исходящие данные передавались сразу же после их отправки клиентским скриптом.

В настоящее время я должен сделать это в цикле:

s = TCPsocket.new('127.0.0.1',2000)
s.send('Hello World',0)
s.close

Однако это означает, что мне постоянно приходится повторно подключаться к серверу сокетов, часто в очень быстрой последовательности. Я хотел бы иметь возможность подключиться к серверу сокетов за пределами цикла и закрыть, когда цикл будет завершен. Если я сделаю это сейчас, все отправленные данные будут отправлены сразу, когда будет инициировано «закрытие».

Можно ли сохранить соединение открытым, продолжая отправлять информацию? Я знаю, что это возможно в других языках и сценариях, как я делал это несколько раз в AS3.

Заранее спасибо.

Ответы [ 3 ]

10 голосов
/ 15 августа 2011

Чтобы ответить на мой собственный вопрос (надеюсь, на помощь других), добавление \000 после сообщения в рубине socket.send('some message\000', 0) работает.Чтобы уточнить, вы можете ввести это

socket = TCPsocket.new('127.0.0.1',2000)
socket.send('some message\000', 0)

Выше будет отправлять сообщение без предварительного, чтобы сначала закрыть соединение сокета (socket.close).Также для справки приведем сервер сокетов ruby, который я использую для трансляции во Flash.

require 'socket'
portnumber = 2000
socketServer = TCPServer.open(portnumber)

while true
  Thread.new(socketServer.accept) do |connection|
    puts "Accepting connection from: #{connection.peeraddr[2]}"

    begin
      while connection
        incomingData = connection.gets("\0")
        if incomingData != nil
          incomingData = incomingData.chomp
        end

        puts "Incoming: #{incomingData}"

        if incomingData == "DISCONNECT\0"
          puts "Received: DISCONNECT, closed connection"
          connection.close
          break
        else
          connection.puts "#{incomingData}"
          connection.flush
        end
      end
    rescue Exception => e
      # Displays Error Message
      puts "#{ e } (#{ e.class })"
    ensure
      connection.close
      puts "ensure: Closing"
    end
  end
end

Надо отдать должное, и код сервера сокетов основан на этом сообщении в блоге: http://www.giantflyingsaucer.com/blog/?p=1147

3 голосов
/ 09 апреля 2013

используйте close_write(), чтобы запретить дальнейшую запись с помощью системного вызова shutdown.Подробнее Розетка , BasicSocket

Socket.tcp("www.ruby-lang.org", 80) {|sock|
  sock.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  sock.close_write
  puts sock.read
}
2 голосов
/ 01 августа 2011

Работает ли flush?

s = TCPSocket.new('127.0.0.1', 2000)
1.upto(10) do |n|
  s.send("Hello #{n}\n", 0)
  s.flush
end
s.close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...