Ruby中两个客户端之间的通信

问题描述 投票:0回答:1

我正在尝试创建一个Ruby程序,该程序将在中间带有服务器的两个客户端之间发送消息。 例如,客户端A连接到服务器,而客户端B连接到相同的服务器和端口。 客户A说:“你好吗?” 客户B说“做得很好”。 有点像聊天服务器。 我正在考虑让服务器从客户端A接收消息并将其发送到客户端B。到目前为止,我有这个正在运行的客户端和服务器程序,使用证书进行连接。 我的问题是我的服务器发回了客户端A,但我不知道如何发送到第二个连接(客户端B)。

客户

#!/usr/bin/ruby
require "socket"
require "openssl"
require "thread"

host = ARGV[0]
port = Integer(ARGV[1])

socket = TCPSocket.new(host, port)
certificate = OpenSSL::X509::Certificate.new(File.open("server.crt"))
ssl = OpenSSL::SSL::SSLSocket.new(socket)
ssl.sync_close = true
ssl.connect
if ssl.peer_cert.to_s != certificate.to_s
  stderrr.puts "Unexpected certificate"
  exit(1)
end

# Get input through the server
Thread.new {
  begin
    while server_res = ssl.gets.chomp
      puts server_res
    end
  rescue
    $stderr.puts "Error in server response loop: " + $!
  end
}
# send out the STDIN to the server
while (client_sent = STDIN.gets.chomp)
  ssl.puts client_sent 
end

服务器

#!/usr/bin/ruby

require "socket"
require "openssl"
require "thread"

port = Integer(ARGV[0])
server = TCPServer.new(port)

sslCont = OpenSSL::SSL::SSLContext.new
sslCont.cert = OpenSSL::X509::Certificate.new(File.open("server.crt"))
sslCont.key = OpenSSL::PKey::RSA.new(File.open("server.key"))

sslServ = OpenSSL::SSL::SSLServer.new(server, sslCont)

loop {
  connection = sslServ.accept
  Thread.new {
    begin
      while (client_sent = connection.gets) do
        client_sent = client_sent.chomp
        puts "Client Sent: " + client_sent
        server_res = "Server Response: " + client_sent
        puts server_res
        connection.puts server_res
      end
    rescue
      $stderr.puts $!
    end
  }
}
ruby sockets client-server chat
1个回答
2
投票
  • 保留一系列可接受的连接

     connections = [] 
  • 有人连接或断开连接时保持最新

     connections << connection ... connections.delete(connection) 
  • 发送时,您可以发送给所有人:

     connections.each do |conn| conn.puts server_res end 
  • 或除当前以外的所有内容:

     connections.each do |conn| next if conn == connection conn.puts server_res end 
  • 编辑:从注释移开,因为它很重要:将connections.delete放入begin...rescue...finally...end块的finally子句中。 这样,当连接由于某种原因而中断时(无论是自然地打破了while条件,还是异常地自然而然),它都会被执行。 您不能做的就是将其放在线程块之外,因为那样一来,每个connection都会在connections放入后立即从connections中删除。

© www.soinside.com 2019 - 2024. All rights reserved.