0

したがって、配列を反復処理して複数のチャット クライアントに応答を送信する場合を除いて、私のコードは正常に動作します。各クライアントが応答を受信するまでの待ち時間はほぼ 1 秒です。サーバーとクライアントを自分のコンピューターで実行しているので、実際の遅延は発生しないはずですよね? ルビーがそれほど遅くないことは知っています。また、これを実行しているときにコンピュータのファンが回転するのはなぜですか? 含めると役立つ場合は、もう少しあります。

# Creates a thread per client that listens for any messages and relays them to the server viewer and all the other clients.
create_client_listener_threads = Thread.new do
    x = nil
    client_quantity = 0
    # Loops indefinitely
    until x != nil
        #Checks to see if clients have joined since last check.
        if @client_join_order_array.size > client_quantity
            # Derives number of new arrivals.
            number_of_new_arrivals = @client_join_order_array.size - client_quantity
            # Updates number of clients in client_quantity.
            client_quantity = @client_join_order_array.size
            if number_of_new_arrivals != 0
                # Passes new arrivals into client for their thread creation.
                @client_join_order_array[-1 * number_of_new_arrivals..-1].each do |client|
                    # Creates thread to handle receiving of each client's text.
                    client_thread = Thread.new do
                        loop do
                            text = client.acception.gets
                            # Displays text for server viewer.
                            puts "#{client.handle} @ #{Time.now} said: #{text}"
                            @client_hash.each_value do |value|
                                if value.handle != client.handle
                                    # Displays text for everyone except server viewr and person who spoke.
                                    value.acception.puts "#{client.handle} @ #{Time.now} said: #{text}"
                                end
                            end
                        end
                    end
                end
            end
        end
    end
end
4

1 に答える 1

1

をテストif @client_join_order_array.size > client_quantityして、それが false の場合に CPU をスモークする以外は何もしない代わりに、この時点で新しい接続を受け入れ、接続が確立されるまでブロックする必要があります。つまり、接続を受け入れるコードを移動して、ここの配列に追加します。

于 2013-04-12T00:53:06.887 に答える