簡體   English   中英

紅寶石中的TCPServer,代碼被卡住

[英]TCPServer in ruby, Code is stuck

我用紅寶石制作了一個小游戲來練習編程,到目前為止一切都進展順利,但是我想實現多人支持,我可以連接到服務器並且可以發送信息,但是當我嘗試從服務器讀取信息時,它就會凍結並且我屏幕完全變黑。 我找不到原因,我已經閱讀了用於TCP的gem im的文檔,我不知道,也許我錯過了一些東西,但是如果你們有什么見識,我將非常感謝

如果此代碼不夠,請使用此倉庫

https://github.com/jaypitti/ruby-2d-gosu-game

這是客戶端代碼

class Client
  include Celluloid::IO
  def initialize(server, port)
    begin
      @socket = TCPSocket.new(server, port)
    rescue
      $error_message = "Cannot find game server."
    end
  end
  def send_message(message)
    @socket.write(message) if @socket
  end
  def read_message
    @socket.readpartial(4096) if @socket
  end
end

這是游戲服務器

require 'celluloid/autostart'
require 'celluloid/io'
class Server
  include Celluloid::IO
  finalizer :shutdown
  def initialize(host, port)
    puts "Starting Server on #{host}:#{port}."
    @server = TCPServer.new(host, port)
    @objects = Hash.new
    @players = Hash.new
    async.run
  end
  def shutdown
    @server.close if @server
  end
  def run
    loop { async.handle_connection @server.accept }
  end
  def handle_connection(socket)
    _, port, host = socket.peeraddr
    user = "#{host}:#{port}"
    puts "#{user} has joined the arena."
    loop do
      data = socket.readpartial(4096)
      data_array = data.split("\n")
      if data_array and !data_array.empty?
        begin
          data_array.each do |row|
            message = row.split("|")
            if message.size == 10
              case message[0] 
              when 'obj'
                @players[user] = message[1..9] unless @players[user]
                @objects[message[1]] = message[1..9]
              when 'del'
                @objects.delete message[1]
              end
            end
            response = String.new
            @objects.each_value do |obj|
              (response << obj.join("|") << "\n") if obj
            end
            socket.write response
          end
        rescue Exception => exception
          puts exception.backtrace
        end
      end # end data
    end # end loop
  rescue EOFError => err
    player = @players[user]
    puts "#{player[3]} has left"
    @objects.delete player[0]
    @players.delete user
    socket.close
  end
end
server, port = ARGV[0] || "0.0.0.0", ARGV[1] || 1234
supervisor = Server.supervise(server, port.to_i)
trap("INT") do
  supervisor.terminate
  exit
end
sleep

首先,您不應該在所有地方拯救Exception 在嵌套的迭代器周圍包裝長期的搶救塊正在乞求麻煩。

聽起來像是線程問題,內存和/或CPU,但這只是一個猜測。 嘗試監視您的資源或使用一些性能檢查工具。 但是對於中本聰(Satoshi Nakamoto)的熱愛,請寫一些測試報道,看看您的方法慘遭失敗,然后修復它們!

其中一些可能會有所幫助:

group :development do
  gem 'bullet', require: false
  gem 'flamegraph', require: false
  gem 'memory_profiler', require: false
  gem 'rack-mini-profiler', require: false
  gem 'seed_dump'
  gem 'stackprof', require: false
  gem 'traceroute', require: false
end

它只是死機了,我的屏幕變成了全黑。 我找不到原因

您可以看到的一個不錯的技巧是使用rbspyrbtrace將其附加到您的進程中,以查看卡住時進程是否繼續進行。

您也可以先嘗試在此處稍微減少依賴關系,然后在使用賽璐璐或事件機器完全異步之前,使用簡單的線程池進行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM