使用ruby发送套接字消息而不关闭连接

时间:2011-08-01 00:24:38

标签: ruby sockets

我正在开发一个小型ruby客户端,它将连续的信息流发送到套接字服务器(然后传递给其他侦听的客户端)。我不希望每次发送数据时都关闭连接,但是看起来使用ruby,在关闭连接之前不会发送数据。是否有另一种方法可以在不重新连接到服务器的情况下执行此操作?传输数据必须在客户端脚本发送后立即传递。

目前我必须在循环中执行此操作:

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

但是,这意味着我经常需要非常快速地重新连接到套接字服务器。我希望能够连接到循环外部的套接字服务器,并在循环完成时关闭。如果我现在这样做,发送数据将在“关闭”开始时立即发送。

是否可以在继续发送信息的同时保持连接打开?我知道这在其他语言和脚本中是可行的,因为我在AS3中已经多次这样做了。

提前致谢。

3 个答案:

答案 0 :(得分:9)

要回答我自己的问题(希望得到其他人的帮助),请在红宝石\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

答案 1 :(得分:3)

使用close_write()禁止使用shutdown系统调用进一步写入。更多SocketBasicSocket

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 :(得分:2)

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