Чтение онлайн

на главную - закладки

Жанры

Программирование на языке 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"

Поделиться:
Популярные книги

Горы судьбы (сборник)

Карсак Франсис
Классика мировой фантастики
Фантастика:
научная фантастика
7.86
рейтинг книги
Горы судьбы (сборник)

Буря мечей

Мартин Джордж Р.Р.
Фантастика:
фэнтези
5.00
рейтинг книги
Буря мечей

Рыцарь

Андрижески Дж. С.
5. Мост и Меч
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Рыцарь

Здравствуйте, я ваша ведьма! Трилогия

Андрианова Татьяна
Здравствуйте, я ваша ведьма!
Фантастика:
юмористическая фантастика
8.78
рейтинг книги
Здравствуйте, я ваша ведьма! Трилогия

Осколки на снегу. Игра на выживание

Птицына Элина
Фантастика:
эпическая фантастика
фэнтези
5.00
рейтинг книги
Осколки на снегу. Игра на выживание

Кодекс Охотника. Книга XXXL

Винокуров Юрий
42. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXL

Газлайтер. Том 5

Володин Григорий Григорьевич
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.75
рейтинг книги
Газлайтер. Том 5

Чужак

Фрай Макс
1. Лабиринты Ехо
Фантастика:
фэнтези
9.20
рейтинг книги
Чужак

Саквояж со светлым будущим

Устинова Татьяна Витальевна
Детективы:
прочие детективы
8.77
рейтинг книги
Саквояж со светлым будущим

Unknown

Helen
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Unknown

На исходе дня. История ночи

Экерч А. Роджер
Научно-образовательная:
история
культурология
5.00
рейтинг книги
На исходе дня. История ночи

Досье Дрездена. Книги 1 - 15

Батчер Джим
Досье Дрездена
Фантастика:
фэнтези
ужасы и мистика
5.00
рейтинг книги
Досье Дрездена. Книги 1 - 15

Другая хронология катастрофы 1941. Падение «сталинских соколов»

Солонин Марк Семенович
Научно-образовательная:
история
5.83
рейтинг книги
Другая хронология катастрофы 1941. Падение «сталинских соколов»

Ipso jure. /лат. «В силу закона.»

Кайнэ
Проза:
современная проза
5.00
рейтинг книги
Ipso jure. /лат. «В силу закона.»