Программирование на языке Ruby

На нашем литературном портале можно бесплатно читать книгу Программирование на языке Ruby, Фултон Хэл-- . Жанр: Программирование. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
Программирование на языке Ruby
Название: Программирование на языке Ruby
Дата добавления: 16 январь 2020
Количество просмотров: 525
Читать онлайн

Программирование на языке Ruby читать книгу онлайн

Программирование на языке Ruby - читать бесплатно онлайн , автор Фултон Хэл
Ruby — относительно новый объектно-ориентированный язык, разработанный Юкихиро Мацумото в 1995 году и позаимствовавший некоторые особенности у языков LISP, Smalltalk, Perl, CLU и других. Язык активно развивается и применяется в самых разных областях: от системного администрирования до разработки сложных динамических сайтов. Книга является полноценным руководством по Ruby — ее можно использовать и как учебник, и как справочник, и как сборник ответов на вопросы типа «как сделать то или иное в Ruby». В ней приведено свыше 400 примеров, разбитых по различным аспектам программирования, и к которым автор дает обстоятельные комментарии. Издание предназначено для программистов самого широкого круга и самой разной квалификации, желающих научиться качественно и профессионально работать на Ruby.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Перейти на страницу:

$mutex = Mutex.new

$list = {}

def match?(p1, p2)

 return false if !$list[p1] or !$list[p2]

 if ($list[p1][0] == p2 and $list[p2][0] == p1)

  true

 else

  false

 end

end

def handle_client(sess, msg, addr, port, ipname)

 $mutex.synchronize do

  cmd, player1, player2 = msg.split

  # Примечание: от клиента мы получаем данные в виде user:hostname,

  # но храним их в виде user:address.

  p1short = player1.dup           # Короткие имена

  p2short = player2.split(":")[0] # (то есть не ":address").

  player1 << ":#{addr}"           # Добавить IP-адрес клиента.

  user2, host2 = player2.split(":")

  host2 = ipname if host2 == nil

  player2 = user2 + ":" + IPSocket.getaddress(host2)

  if cmd != "login"

   puts "Ошибка протокола: клиент послал сообщение #{msg}."

  end

  $list[player1] = [player2, addr, port, ipname, sess]

  if match?(player1, player2)

   # Имена теперь переставлены: если мы попали сюда, значит

   # player2 зарегистрировался первым.

   p1 = $list[player1]

   р2 = $list[player2]

   # ID игрока = name:ipname:color

   # Цвет: 0=белый, 1=черный

   p1id = "#{p1short}:#{p1[3]}:1"

   p2id = "#{p2short}:#{p2[3]}:0"

   sess1 = p1[4]

   sess2 = p2[4]

   sess1.puts "#{p2id}"

   sess2.puts "#{p1id}"

   sess1.close

   sess2.close

  end

 end

end

text = nil

$server = TCPServer.new(HOST, PORT)

while session = $server.accept do

 Thread.new(session) do |sess|

  text = sess.gets

  puts "Получено: #{text}" # Чтобы знать, что сервер получил.

  domain, port, ipname, ipaddr = sess.peeraddr

  handle_client sess, text, ipaddr, port, ipname

  sleep 1

 end

end

waiter.join                # Выходим, когда была нажата клавиша Enter.

Метод

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

Клиент (листинг 18.2) оформлен в виде единственной программы. При первом запуске она становится TCP-сервером, а при втором — TCP-клиентом. Честно говоря, решение о том, что сервер будет играть белыми, совершенно произвольно. Вполне можно было бы реализовать приложение так, чтобы цвет не зависел от подобных деталей.

Листинг 18.2. Шахматный клиент

require "socket"

require "timeout"

ChessServer = '96.97.98.99' # Заменить этот IP-адрес.

ChessServerPort = 12000

PeerPort = 12001

WHITE, BLACK = 0, 1

Colors = %w[White Black]

def draw_board(board)

 puts <<-EOF

+------------------------------+

| Заглушка! Шахматная доска... |

+------------------------------+

 EOF

end

def analyze_move(who, move, num, board)

 # Заглушка - черные всегда выигрывают на четвертом ходу.

 if who == BLACK and num == 4

  move << " Мат!"

 end

 true # Еще одна заглушка - любой ход считается допустимым.

end

def my_move(who, lastmove, num, board, sock)

 ok = false

 until ok do

  print "nВаш ход: "

  move = STDIN.gets.chomp

  ok = analyze_move(who, move, num, board)

  puts "Недопустимый ход" if not ok

 end

  sock.puts move

 move

end

Перейти на страницу:
Комментариев (0)
название