Программирование на языке Ruby
Шрифт:
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
def other_move(who, move, num, board, sock)
move = sock.gets.chomp
puts "\nПротивник: #{move}"
move
end
if ARGV[0]
myself = ARGV[0]
else
print "Ваше имя? "
myself = STDIN.gets.chomp
end
if ARGV[1]
opponent_id = ARGV[1]
else
print "Ваш противник? "
opponent_id = STDIN.gets.chomp
end
opponent = opponent_id.split(":")[0] # Удалить имя хоста.
# Обратиться к серверу
socket = TCPSocket.new(ChessServer, ChessServerPort)
response = nil
socket.puts "login # {myself} #{opponent_id}"
socket.flush
response = socket.gets.chomp
name, ipname, color = response.split ":"
color = color.to_i
if color == BLACK # Цвет фигур другого игрока,
puts "\nУстанавливается соединение..."
server = TCPServer.new(PeerPort)
session = server.accept
str = nil
begin
timeout(30) do
str = session.gets.chomp
if str != "ready"
raise "Ошибка протокола: получено сообщение о готовности #{str}."
end
end
rescue TimeoutError
raise "He получено сообщение о готовности от противника."
end
puts "Ваш противник #{opponent}... у вас белые.\n"
who = WHITE
move = nil
board = nil # В этом примере не используется.
num = 0
draw_board(board) # Нарисовать начальное положение для белых.
loop do
num += 1
move = my_move(who, move, num, board, session)
draw_board(board)
case move
when "resign"
Поделиться:
Популярные книги
Выдумщик (Сочинитель-2)
6. Бандитский Петербург
Детективы:
боевики
7.93
рейтинг книги
Я уже барон
2. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 4
4. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Размышления русского боксёра в токийской академии Тамагава, 2
2. Размышления русского боксёра в токийской академии
Фантастика:
альтернативная история
5.80
рейтинг книги
Вперед в прошлое 5
5. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Отряд
5. Ермак
Фантастика:
альтернативная история
5.25
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга вторая
2. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Моя простая курортная жизнь
1. Моя простая курортная жизнь
Проза:
современная проза
5.00
рейтинг книги
Двойник короля 18
18. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Неучтенный элемент. Том 2
2. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Новик
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Я граф. Книга XII
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бандит 2
2. Петр Синельников
Фантастика:
боевая фантастика
5.73