Хэл Фултон - Программирование на языке Ruby

Здесь есть возможность читать онлайн «Хэл Фултон - Программирование на языке Ruby» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: ДМК Пресс, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Программирование на языке Ruby: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Программирование на языке Ruby»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

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

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Программирование на языке Ruby», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Поскольку клиенты посылают запросы и ответы попеременно, причем сеанс связи включает много таких обменов, будем пользоваться протоколом TCP. Следовательно, клиент, который на самом деле играет роль «сервера», создает объект TCPServer, а клиент на другом конце — объект TCPSocket. Будем предполагать, что номер порта для обмена данными заранее известен обоим партнерам (разумеется, У каждого из них свой номер порта).

Мы только что описали простой протокол прикладного уровня. Его можно было бы сделать и более хитроумным.

Сначала рассмотрим код сервера (листинг 18.1). Чтобы его было проще запускать из командной строки, создадим поток, который завершит сервер при нажатии клавиши Enter. Сервер многопоточный — он может одновременно обслуживать нескольких клиентов. Данные о пользователях защищены мьютексом, ведь теоретически несколько потоков могут одновременно попытаться добавить новую запись в список.

Листинг 18.1. Шахматный сервер

require "thread"

require "socket"

PORT = 12000

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

# Выход при нажатии клавиши Enter.

waiter = Thread.new do

puts "Нажмите Enter для завершения сервера."

gets

exit

end

$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

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

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Программирование на языке Ruby»

Представляем Вашему вниманию похожие книги на «Программирование на языке Ruby» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Программирование на языке Ruby»

Обсуждение, отзывы о книге «Программирование на языке Ruby» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x