Итак, вы решили изучить основу многих протоколов высшего уровня,
то бишь ТСР? Хорошо! Чем он хорош? Гарантией того, что сообщение придет
в целости и сохранности. Однако, в результате этого мы теряем скорость.
Целеобразно использовать ТСР там, где надежность важнее скорости. В
ином случае - используйте UDP(я уже написал туториал по нему -
почитайте). Начнем, пожалуй, с пары нюансов. Во-первых, ТСР
использует архитектуру "клиент-сервер", что облегчает нам жизнь, и на
нужно знать IP-адресс только сервера. Всмысле, сначала. Во-вторых, тут
насчет портов такой же принцип как и в UDP. Порты до 1024 являются
системными и использовать их в сетевых играх не стоит. Также следует
поберечься от портов с номерами от 1024 до 49151 - они
зарезервированны. Рекомендуется использовать порты с номерами от 49152
до 65535 - они динамические. В отличие от UDP, в ТСР вам надо сразу
определится с портом, ибо тут нет таких вольностей, как "обнаружение
свободных портов". Рассмотрев моменты, приступим к рассмотру
команд. Итак, так как в ТСР архитектура "клиент-сервер", значит у нас
имеется две команды инициализации сеанса: для сервера и для клиента.
Для начала давайте разберемся с сервером.
поток_сервера=CreateTCPServer(порт)
Создает
сервер потока ТСР на указанный порт и возвращает хэндл потока сервера.
Возвращает 0, если неудачно, поток - если удачно. Про порты уже
говорилось выше. Далее, для сервера, чтобы получать и писать сообщение,
надо принимать входящий поток. Делается это коммандой AcceptTCPStream
вот так: поток=AcceptTCPStream(поток_сервера)
Думаю, в примере это будет смотрется понятнее:
svr=CreateTCPServer(80) While Not KeyHit(1) pot=AcceptTCPStream(svr) Wend
Таким
образом, мы создали сервер на порте 80. К слову, если вы на блице
пишете программу для работы с сетью (броузер, почтовый клиент и т.д.),
то вы конечно же можете использовать системные порты - они для того и
предназначены. Однако, если вы создаете игру - берите динамический и
только. Вернемся к коду. Мы каждый цикл пытаемся принять входящий
поток, чтобы в цикле можно было соответственно читать и посылать
информацию. Чтобы получить IP-адресс пославшего, используем функцию
TCPStreamIP. Синтаксис:
переменная=TCPStreamIP(поток)
Возвращает целочисленный IP в переменную. Если вам надо получить точечный IP - смотрите в справке DottedIP$() Также можно получить порт машины клиента функцией TCPStreamPort:
переменная=TCPStreamPort(поток)
Обьяснять, думаю не надо? Теперь
о передаче информации. А как же эта информация собственно посылается и
получается? Очень просто! Вы, я думаю, уже работали с файлами, не так
ли? Так вот, представьте, что ТСР-поток - это ваш файл и просто
используйте команды для чтения в или из потока. Правда, с чтением есть
еще один нюанс - надо проверять, пришла ли какая-то информация. Это
очень просто! AcceptTCPStream возвращает 0, если ничего не пришло и
поток для того, кто послал сообщение, если оно, собсно, было посланно.
И нужно учесть еще вот что - человек мог сделать запрос вот таким:
WriteLine pot,"1" WriteLine pot,"2" WriteLine pot,"3"
Как его считать? Опять таки, очень просто! С помощью, думаю, знакомой вам функции Eof:
Eof(поток)
Возвращает False если информация в потоке еще не закончилась и True, если вся уже пришла и считана. Вот как это:
svr=CreateTCPServer(50000) While Not KeyHit(1) pot=AcceptTCPStream(svr) If pot Then While Not Eof(pot) Print Readline$(pot) Wend Endif Wend
Чтобы написать игроку, нужно писать именно на уникальный поток. Сейчас я вам покажу, как собсно получить этот поток:
Type Player
Field stream End Type
svr=CreateTCPServer(50000) While Not Keyhit(1) pot=AcceptTCPStream(svr) If pot Then p.Player=New Player p\stream=pot Endif Wend
Далее, чтобы получать сообщения не от новых игроков, а от тех, что уже записаны, используем следующую схему:
For p.Player=Each Player
If ReadAvail(p\stream) Then ... Endif Next
Думаю, все ясно как пень. Самая сложная часть позади. Теперь давайте о клиенте. Подключается он командой OpenTCPStream. Синтаксис:
поток=OpenTCPStream(IP_сервера,порт)
Возвращает 0
если неуспешно, и поток - если успешно. Тут все проще, нежели у
сервера. Просто посылаем информацию на этот же поток и все! Для
наглядности пример:
pot=OpenTCPStream("prevedmedved.ru",80) WriteLine pot,"PREVED!"
Вот
и все! Что еще хотелось бы сказать, так это насчет посылания сообщения
другим клиентам. Так вот. ВСЕ передается через сервер. Вот так вот.
Если надо послать мэссагу кому-то одному - шлем запрос серверу. Хотим
всем - шлем запрос к серверу. И сервер должен все эти запросы
отрабатывать. Вот и закончили мы долбить второй основной протокол,
поддерживаемый блицем. А что это нам дает? Очень многое. Ведь нам
открывается дорога к протоколам более высокого уровня. Но об этом в
следующих статьях.
|