Программирование на языке Ruby
Программирование на языке 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 endenddef 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 endendtext = 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 endendwaiter.join # Выходим, когда была нажата клавиша Enter.Метод
handle_clientКлиент (листинг 18.2) оформлен в виде единственной программы. При первом запуске она становится TCP-сервером, а при втором — TCP-клиентом. Честно говоря, решение о том, что сервер будет играть белыми, совершенно произвольно. Вполне можно было бы реализовать приложение так, чтобы цвет не зависел от подобных деталей.
require "socket"require "timeout"ChessServer = '96.97.98.99' # Заменить этот IP-адрес.ChessServerPort = 12000PeerPort = 12001WHITE, BLACK = 0, 1Colors = %w[White Black]def draw_board(board) puts <<-EOF+------------------------------+| Заглушка! Шахматная доска... |+------------------------------+ EOFenddef analyze_move(who, move, num, board) # Заглушка - черные всегда выигрывают на четвертом ходу. if who == BLACK and num == 4 move << " Мат!" end true # Еще одна заглушка - любой ход считается допустимым.enddef 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 moveend
