29.10.2017, 16:42
Приветствую в первой части рубрики "КАК ПОНЯТЬ?", которая посвящена пакетам. Тут мы разберемся что такое пакет, какие функции нам понадобятся для работы с ними, и как вообще с ними работать. Итак, для начала неплохо было бы понять что такое пакет.
"В компьютерных сетях пакет — это определённым образом оформленный блок данных, передаваемый по сети в пакетном режиме" © Wikipedia.
Если проще, и на примере Gothic 2 Online, пакет - это информация, которая передается от сервера к клиенту, или наоборот. Если Вы изменили свою позицию в мире, то информация с Вашими новыми координатами отправится всем другим игрокам в виде пакета. Но что делать, если необходимо сообщить свою информацию другим игрокам, например - уровень администратора игрока? Тут нам понадобятся следующие функции:
Теперь myPacket является объектом класса Packet, а значит мы можем использовать методы описанные выше.
Чтобы нам записать цвет в формате RGB достаточно лишь UInt8, а чтобы виртуальный мир игрока - нам уже придется воспользоваться UInt16 (максимальное число виртуальных миров - 65535). Например, myPacket.writeInt8(-30) или myPacket.writeUInt32(20000).
То считывать информацию необходимо так:
Теперь давайте поговорим об отправке и получении пакетов. Для этого нам понадобится еще 2 ивента в добавок к описанным выше методам:
Итак, теперь давайте отправим пакет со стороны сервера к клиенту с ID 0.
Как видите, тут все очень просто, и по сути больше объяснять нечего кроме еще парочки методов:
Автор статьи: Osmith.
Используемые материалы:
"В компьютерных сетях пакет — это определённым образом оформленный блок данных, передаваемый по сети в пакетном режиме" © 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) - ивент на стороне клиента.
- void myPacket.send(int id, int reliability) - отправляет пакет игроку (клиенту) с номером id (со стороны сервера).
- void myPacket.send(int reliability) - отправляет пакет от игрока (клиента) на сервер (со стороны клиента).
Итак, теперь давайте отправим пакет со стороны сервера к клиенту с 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.
Используемые материалы:
- Gothic 2 Online Wiki - http://gothic-online.com.pl/new_wiki/index.php
- Wikipedia - https://www.wikipedia.org
- MATHLAB Help Page - http://my.math.wsu.edu/help/matlab/