Программирование на языке 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
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-клиентом. Честно говоря, решение о том, что сервер будет играть белыми, совершенно произвольно. Вполне можно было бы реализовать приложение так, чтобы цвет не зависел от подобных деталей.
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