Ruby:通过TCP套接字发送字符串

时间:2018-07-15 10:13:01

标签: ruby sockets tcp tcpsocket celluloid

我对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 个答案:

没有答案