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

ЖАНРЫ

Программирование на языке Ruby
Шрифт:

# но храним их в виде 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

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

Поделиться с друзьями: