我正在开发一个小型ruby客户端,它将连续的信息流发送到套接字服务器(然后传递给其他侦听的客户端)。我不希望每次发送数据时都关闭连接,但是看起来使用ruby,在关闭连接之前不会发送数据。是否有另一种方法可以在不重新连接到服务器的情况下执行此操作?传输数据必须在客户端脚本发送后立即传递。
目前我必须在循环中执行此操作:
s = TCPsocket.new('127.0.0.1',2000)
s.send('Hello World',0)
s.close
但是,这意味着我经常需要非常快速地重新连接到套接字服务器。我希望能够连接到循环外部的套接字服务器,并在循环完成时关闭。如果我现在这样做,发送数据将在“关闭”开始时立即发送。
是否可以在继续发送信息的同时保持连接打开?我知道这在其他语言和脚本中是可行的,因为我在AS3中已经多次这样做了。
提前致谢。
答案 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系统调用进一步写入。更多Socket,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 :(得分: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