Ruby - 多线程 TCP 消息

标签 ruby multithreading sockets tcp

我正在编写的 ruby​​ 服务器出现问题。

服务器运行良好,直到您连接了多个客户端,然后它以类似循环的方式发送消息,当我希望所有客户端同时收到消息时。

服务器本应获取所有连接的客户端,但要等到我发出命令。问题是只有一个客户端正在获取命令,当我再次输入命令时,另一个客户端会获取命令,依此类推

服务器

require 'socket'
mutex = Mutex.new
cv = ConditionVariable.new
server = TCPServer.open(2000)
@Comm="test"
Thread.new{
loop {  
    Thread.start(server.accept) do |client|
        client.puts("Client accepted")
        mutex.synchronize {
        cv.wait(mutex)
        client.puts("#@Comm")
        client.close
        }
    end
    }
}

loop {
system "clear" or system "cls"
print("Enter Command\n")
@Comm = gets()
mutex.synchronize {
cv.signal
   }
}

客户

require 'socket'      # Sockets are in standard library

hostname = 'localhost'
port = 2000

loop {
begin
s = TCPSocket.open(hostname, port)
system "clear" or system "cls"
while line = s.gets   # Read lines from the socket
  puts line.chop      # And print with platform line terminator
end
s.close
rescue
next
end
sleep(0.5)
}

最佳答案

在 ConditionVariable 上使用 .signal 只会唤醒一个线程,但是 .broadcast 会去唤醒所有等待信号的线程。

关于Ruby - 多线程 TCP 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42940565/

相关文章:

c++ - 错误 C2248 : 'std::promise<_Ty>::promise' : cannot access private member declared in class 'std::promise<_Ty>'

c# - 这个套接字监听器真的在多线程级别上处理吗?

javascript - 当只调用一次 emit 时,自定义事件被多次触发

c# - 从工作线程调用 UI 线程时出现死锁

ruby-on-rails - 何时考虑在 Rails 应用程序中创建自己的 Ruby 模块?

ruby - 如何使用字符串数组循环遍历字符串以查找匹配项?

ruby-on-rails - 缓存日期早于 1900 年的模型时出现编码错误

java - 后台服务套接字断开->前台开关

swift - 如何从套接字获取数据并制作 protobuf 文件?

ruby-on-rails - Ruby 和 Rails 性能问题,服务器