【问题标题】:Sending socket message with ruby without closing connection使用 ruby​​ 发送套接字消息而不关闭连接
【发布时间】:2011-08-01 00:24:37
【问题描述】:

我正在开发一个小型 ruby​​ 客户端,它将连续的信息流发送到套接字服务器(然后将其传递给正在侦听的其他客户端)。我不想每次发送数据时都必须关闭连接,但是似乎使用 ruby​​,直到我关闭连接才会发送数据。有没有另一种方法可以在不重新连接到服务器的情况下做到这一点?传出数据在客户端脚本发送后立即传递是很重要的。

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

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

但是,这意味着我必须不断地重新连接到套接字服务器,而且通常是很快地连续进行。我希望能够在循环之外连接到套接字服务器并在循环完成后关闭。如果我现在这样做,发送数据将在启动“关闭”时立即发送。

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

提前致谢。

【问题讨论】:

    标签: ruby sockets


    【解决方案1】:

    要回答我自己的问题(希望对其他人有所帮助),请在 ruby​​ socket.send('some message\000', 0) 作品中的消息后附加 \000。为了澄清,你可以输入这个

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

    上面将发送一条消息,而无需先关闭套接字连接(socket.close)。另外供参考的是我用来广播到 Flash 的 ruby​​ 套接字服务器。

    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

    【讨论】:

      【解决方案2】:

      使用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
      }
      

      【讨论】:

        【解决方案3】:

        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
        

        【讨论】:

        • 不幸的是,这不起作用。我会尝试看看在服务器代码中是否有我可以做的事情,但是服务器代码可以毫无问题地处理来自 Flash AS3 的连接和数据传输(这让我相信故障不在于套接字服务器)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 2012-03-31
        • 2011-11-13
        • 2013-07-23
        相关资源
        最近更新 更多