Thread Rating:
  • 1 Vote(s) - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
КАК ПОНЯТЬ? - Часть 1: Пакеты
#1
Приветствую в первой части рубрики "КАК ПОНЯТЬ?", которая посвящена пакетам. Тут мы разберемся что такое пакет, какие функции нам понадобятся для работы с ними, и как вообще с ними работать. Итак, для начала неплохо было бы понять что такое пакет.

"В компьютерных сетях пакет — это определённым образом оформленный блок данных, передаваемый по сети в пакетном режиме" © Wikipedia.

Если проще, и на примере Gothic 2 Online, пакет - это информация, которая передается от сервера к клиенту, или наоборот. Если Вы изменили свою позицию в мире, то информация с Вашими новыми координатами отправится всем другим игрокам в виде пакета. Но что делать, если необходимо сообщить свою информацию другим игрокам, например - уровень администратора игрока? Тут нам понадобятся следующие функции:
  • void Packet.reset()
  • void Packet.send(int reliability)
  • void Packet.writeBool(bool value)
  • void Packet.writeChar(char value)
  • void Packet.writeInt8(int value)
  • void Packet.writeUInt8(int value)
  • void Packet.writeInt16(int value)
  • void Packet.writeUInt16(int value)
  • void Packet.writeInt32(int value)
  • void Packet.writeUInt32(int value)
  • void Packet.writeFloat(float value)
  • void Packet.writeString(string value)
  • bool Packet.readBool()
  • char Packet.readChar()
  • int Packet.readInt8()
  • int Packet.readUInt8()
  • int Packet.readInt16()
  • int Packet.readUInt16()
  • int Packet.readInt32()
  • int Packet.readUInt32()
  • float Packet.readFloat()
  • string Packet.readString()
Да, я понимаю, что их достаточно много, но сейчас мы разберем некоторые из них, и Вы поймете, что тут все просто. Для начала, давайте создадим наш пакет. Делается это так:

Code:
myPacket <- Packet();

Теперь myPacket является объектом класса Packet, а значит мы можем использовать методы описанные выше. 
  • void myPacket.writeBool(bool value) - записывает булевое значение в пакет (true/false). Например, myPacket.writeBool(false).
  • void myPacket.writeChar(char value) - записывает символ в пакет. Символы записываются в одинарных кавычках ('c') или в виде их номера (99). Например, чтобы записать тот же символ c мы можем либо написать myPacket.writeChar('c'), либо myPacket.writeChar(99).
  • void myPacket.writeInt8(int value), myPacket.writeUInt8(int value), myPacket.writeInt16(int value), myPacket.writeUInt16(in value), myPacket.writeInt32(int value), myPacket.writeUInt32(int value) - записывает целое число в пакет. Как определить, какой метод подходит именно Вам:
Quote:
  • Int8 - 8-битное целое число (signed) - принимает значения от -128 до 127 - размер одного элемента 1 байт
  • UInt8 - 8-битное целое число (unsigned) - принимает значения от 0 до 255 - размер одного элемента 1 байт
  • Int16 - 16-битное целое число (signed) - принимает значения от -32.768 до 32.767 - размер одного элемента 2 байта
  • UInt16 - 16-битное целое число (unsigned) - принимает значения от 0 до 65.535 - размер одного элемента 2 байта
  • Int32 - 32-битное целое число (signed) - принимает значения от -2.147.483.648 до 2.147.483.647 - размер одного элемента 4 байта
  • UInt32 - 32-битное целое число (unsinged) - принимает значения от 0 до 4.294.967.295 - размер одного элемента 4 байта

         Чтобы нам записать цвет в формате RGB достаточно лишь UInt8, а чтобы виртуальный мир игрока - нам уже придется воспользоваться UInt16 (максимальное число виртуальных миров - 65535). Например, myPacket.writeInt8(-30) или myPacket.writeUInt32(20000).
  • void myPacket.writeFloat(float value) - записать не целое число (с символами после запятой). Например, myPacket.writeFloat(8.5).
  • void myPacket.writeString(string value) - записать строку. Например, myPacket.writeString("Gothic 2 Online").
С методами считывания все тоже самое, единственное - они естественно считывают информацию с пакета. Одно замечание - считывать нужно именно в том порядке, в каком вы записали. Например, если вы написали такой код:

Code:
myPacket <- Packet();
myPacket.writeString("Hello, World!");
myPacket.writeUInt8(16);

То считывать информацию необходимо так:

Code:
/* WRONG */

myPacket.readUInt8();
myPacket.readString();


/* CORRECT */

myPacket.readString();
myPacket.readUInt8();

Теперь давайте поговорим об отправке и получении пакетов. Для этого нам понадобится еще 2 ивента в добавок к описанным выше методам:
  • onPacket(int id, Packet packet) - ивент на стороне сервера.
  • onPacket(Packet packet) - ивент на стороне клиента.
Эти ивенты отвечают за получение пакетов. Если Вы отправите пакет со стороны сервера, то его примет ивент onPacket на стороне клиента, и наоборот. Чтобы привести пример, нам необходимо рассмотреть еще один метод:
  • void myPacket.send(int id, int reliability) - отправляет пакет игроку (клиенту) с номером id (со стороны сервера).
  • void myPacket.send(int reliability) - отправляет пакет от игрока (клиента) на сервер (со стороны клиента).
Насчет reliability Я ничего объяснять не буду, насчет этого Вы можете узнать здесь: http://gothic-online.com.pl/new_wiki/index.php?title=Constants

Итак, теперь давайте отправим пакет со стороны сервера к клиенту с ID 0.


Code:
/* SERVER */

myPacket <- Packet();
myPacket.writeString("Hello, buddy!");
myPacket.send(0,RELIABLE);


/* CLIENT */

function onPacket(packet) {
  local message = packet.readString();
  print(message); // prints "Hello, buddy!"
}

addEventHandler("onPacket",onPacket);

Как видите, тут все очень просто, и по сути больше объяснять нечего кроме еще парочки методов:
  • void myPacket.sendToAll(int reliablity) - отправляет пакет со стороны сервера всем клиентам.
  • void myPacket.reset() - очищает всю информацию в пакете. Например, если Вы записали туда число, а затем вызвали метод reset, то ваше число из пакета удалится.
На этом все. Надеюсь, данная информация помогла Вам. Оставляйте отзывы в комментариях по поводу улучшения/изменения данной статьи, а также сообщения с тематикой следующей. Спасибо за внимание!

Автор статьи: Osmith.
Используемые материалы:
Discord: I'm not a spy...#9943.
GG: 60474243.

[Image: OsmithREV.gif]
[Image: 76561198181768479.png]
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  КАК ПОНЯТЬ? - Часть 2: Конфиг файл Osmith 0 4,548 14.03.2018, 15:23
Last Post: Osmith
  Курс Squirrel | Часть 1 Kladvey 0 2,720 05.03.2016, 12:57
Last Post: Kladvey

Forum Jump:


Users browsing this thread: 1 Guest(s)