Программирование на языке 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"
Поделиться:
Популярные книги
Неофит
3. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Отвергнутая невеста генерала драконов
5. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужое наследие
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Магическая сделка
3. Долина Драконов
Фантастика:
фэнтези
6.84
рейтинг книги
Моя Академия
1. Академка
Фантастика:
попаданцы
сказочная фантастика
фэнтези
4.50
рейтинг книги
Вагант
6. Ушедший Род
Фантастика:
боевая фантастика
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Сокрушитель
3. Уникум
Фантастика:
боевая фантастика
5.60
рейтинг книги
Реальная жизнь
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Страж Кодекса. Книга II
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 5
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Черный дембель. Часть 1
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Моров. Том 5
4. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол "Наследник"
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюционер из трущоб. Том 9
9. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00