Ruby: отправка строки через TCP-сокет

Я довольно новичок в Ruby, решив попробовать свои силы с другим языком программирования. Я пытался разобраться с розетками, это область, с которой я не слишком знаком в целом. Я создал базовую "игру", которая позволяет игроку перемещать свою иконку по экрану, однако я пытаюсь превратить это во что-то, что может быть многопользовательским с использованием сокетов TCP.

В тот момент, когда игрок запускает игру в качестве хоста, он создает сервер. Если игрок запускает игру как клиент, он подключается к серверу. В настоящее время он работает только на том же компьютере, но соединение было успешно установлено, и при подключении в качестве клиента сервер создает имя пользователя, отправляет его обратно клиенту, который затем использует его для создания проигрывателя.

Проблема возникает, когда я пытаюсь установить связь между сервером и клиентом, сообщения, похоже, отправляются с сервера на клиент, но только частично, и кажется, что они в значительной степени усекаются либо в начале, либо в конце.

Если бы кто-нибудь мог посоветовать, что является причиной этого, это было бы очень признательно. Я использую Ruby с Gosu и Celluloid-IO.

СЕРВЕР КЛАСС

require 'src/Game.rb'
require 'celluloid/io'

class Server
  include Celluloid::IO
  finalizer:shutdown
  def initialize
    puts ("server init")
    #super
    @playersConnected = Array.new
    @actors = Array.new
    @server = TCPServer.new("0.0.0.0", 28888)
    #@server.open(8088)
    puts @server
    async.run

  end

  def run
    loop {
      async.handle_connection @server.accept

    }
  end

  def readMessage(socket, player)
    msg = socket.recv(30)
    data = msg.split"|"

    @playersConnected.each do |p|
      if p.getUser() == player
        p.setX(data[1])
        p.setY(data[2])
      end
      #puts "END"
    end
  end

  def handle_connection(socket)
    _, port, host = socket.peeraddr
    user = "#{host}:#{port}"
    puts "#{user} has joined the game"
    @playersConnected.push(Player.new(user))
    socket.send "#{user}", 0
    #socket.send "#{Player}|#{user}", 0
    #socket.send "#{port}", 0
    puts "PLAYER LIST"
    @playersConnected.each do |player|
      puts player
    end
    Thread.new{
      loop{
        readMessage(socket, user)
        #divide message
        #find array index
        #update character position in array
      }
    }
    Thread.new{
      loop{
        @playersConnected.each do |p|
          msg = p.getUser() + "|" + "#{p.getX}" + "|" + "#{p.getY}" 
          socket.send(msg, 0)
        end
      }
    }
  end

  Server.new

end 

КЛИЕНТСКИЙ КЛАСС

require 'src/Game.rb'

class Client < Game
  #finalizer :shutdown
  def initialize
    super
    @socket = TCPSocket.new("localhost", 28888)
    #188.222.55.241

    while @player.nil?
      @player = Player.new(@socket.recv(1024))
      puts @player
      puts @player.getUser()
      @player.warp(0, 0)
      pulse
    end
  end

  def pulse
    Thread.new{
      loop{
        msg = @player.getUser() + "|" + "#{@player.getX()}" + "|" + "#{@player.getY()}"
        @socket.write(msg)
      }

    }
    Thread.new{
      loop{
        msg = @socket.recv(1024)
        data = msg.split"|"
        puts data[0]
        match = false
        @players.each do |player|
          if player.getUser() == data[0]
            puts "MATCHX"
            player.setX(data[1])
            player.setY(data[2])
            match = true
          end
          if match == false
            p = Player.new(data[0])
            #p.warp(data[1],data[2])
            @players.push(p)
          end
        end
        puts "end"
      }
    }
  end

  Client.new.show

end

Примечание; Существует также класс Host, который имитирует класс клиента, только он вызывает сервер. Я знаю, что это ужасный способ сделать что-то, и я собираюсь исправить это, как только преодолею текущую проблему.

Спасибо заранее

0 ответов

Другие вопросы по тегам