TO

[Open-Library] Simple Packet Structure

Por Tony Araujo, 25 de abr. de 2016 em C# e Visual Basic

[open-library]
simple
packet
structure
7
2.7k
Tony AraujoT
25 de abril de 2016 às 20:33

[Open-Library] Simple Packet Structure

developer: Tony Araújo (OrochiElf) 

version: 0.1

 

Introdução

Olá pessoal, hoje venho mostrar a vocês uma nova estrutura de um pacote de dados para Visual Basic (vb.Net). 

Então galera, eu estou criando um jogo multi-player e na parte de comunicação (servidor <-> client) eu tive uma dificuldade de escrever e ler em Bytes então eu tive a ideia de criar esta nova estrutura de pacote para facilitar esta comunicação. Bem, eu consegui facilitar essa troca de informações apenas criando um novo pacote, escrevendo as informações, então transformando em bytes e enviando por stream até o destinatário, quando eu recebia as bytes eu as transformava em pacote de novo e iniciava a leitura dos valores.

Breve criarei um novo tutorial de como fazer essa comunicação, e também estou terminando uma nova estrutura de comunicação Socket.

 

Estrutura do pacote

A nova estrutura do pacote consiste em uma variável de texto (string) que armazena os valores separados por "|", com fácil escrita e leitura.

É possível escrever 4 tipos de objetos dentro do pacote, tais como, Integer (valor numérico), String (valor textual), Boolean (valor de verdadeiro ou falso) e por fim o Packet(todos os valores de um novo Packet/Pacote), para quem não entendeu, sim é possível escrever um pacote dentro de um pacote.

 

Funções

A nova estrutura conta com funções de manipulação do pacote, como:

write(_value) -> usada para escrever um novo valor no pacote (Integer, String, Boolean, Packet)read(index) -> retorna um valor de dentro da lista de valores do pacote guiado pela indexreadInteger() -> retorna o próximo valor de acordo com o leitor em formato de IntegerreadString() -> como a função acima, retorna o próximo valor de acordo com o leitor em formato de StringreadBoolean() -> como as demais, em formato de BooleanreadPacket() -> retorna o valor em formato de Packet (pacote)toBytes() -> converte o valor do pacote para bytestoPacket(_bytes) -> converte o valor de bytes para o pacote

 

Project

Tutorial de manipulação

Source Code (v0.1)

dalvorsnD
26 de abril de 2016 às 09:06

Sintax feia dessa linguagem '-'

Mas quanto ao codigo, tu ta usando separador '|' para diferenciar entre um dado e outro? Isso não é nem um pouco eficiente, o normal quando se trabalha com packets é basear pelos bytes.

Se tu vai ler um int(2bytes), se vai ler uma string tem 2 bytes pro tamanho da string e o restante de acordo com o tamanho indicado pelos dois bytes, char(1byte) e etc

Eu fiz um code pra isso em lua uma vez, faz um tempinho ja mas acho que da pra esclarecer o que eu to tentando te explicar

http://pastebin.com/szkfJYN5

 

 

 

Tony AraujoT
27 de abril de 2016 às 23:59


Bom, como eu disse, é um sistema de pacotes bem simples e eu criei ele por conta da dificuldade que eu tive em utilizar os bytes, assim, eu consegui simplificar bastante a comunicação, e para fazer esta comunicação via socket eu transformava o pacote feito em string em bytes, enviava pelo socket e quando recebia no servidor, ele transformava em pacote novamente, assim simplificando muito a minha vida. Tem outros usuários desse meu sistema de pacote e que achou uma forma bem fácil de manipulação também

dalvorsnD
28 de abril de 2016 às 09:23
8 hours ago, OrochiElf said:

Bom, como eu disse, é um sistema de pacotes bem simples e eu criei ele por conta da dificuldade que eu tive em utilizar os bytes, assim, eu consegui simplificar bastante a comunicação, e para fazer esta comunicação via socket eu transformava o pacote feito em string em bytes, enviava pelo socket e quando recebia no servidor, ele transformava em pacote novamente, assim simplificando muito a minha vida. Tem outros usuários desse meu sistema de pacote e que achou uma forma bem fácil de manipulação também

Eu entendi, e ja inclusive usei coisas semelhantes, em baixa escala não tem problema nenhum usar. Agora se for uma aplicação grande, que troque muitos dados ou que tenha muitos usuarios isso ja começa a dara diferença, porque pra cada tipo de dado tu tem um byte pelo menos a mais, nos tipos numéricos então, vou só fazer um comparativo pra tu entender a diferença de uso de bytes:

 

 

                                                 Captura de tela de 2016-04-28 09:17:54.png                                                  Captura de tela de 2016-04-28 09:13:41.png

 

Como eu disse, em baixa escala não faz diferença, mas em larga escala faz uma diferença absurda. Não leve isso como algo pejorativo, meu intuito é somente atribuir uma informação que julgo ser importante.

5722003532510_Capturadetelade2016-04-28091754.png.d214333c743b2ae396ab60a031d5e052.png

5722003bb61b6_Capturadetelade2016-04-28091341.png.79d2058f2c215096d5c7c78be04e0b91.png

Tony AraujoT
28 de abril de 2016 às 16:25
7 horas atrás, dalvorsn disse:

Eu entendi, e ja inclusive usei coisas semelhantes, em baixa escala não tem problema nenhum usar. Agora se for uma aplicação grande, que troque muitos dados ou que tenha muitos usuarios isso ja começa a dara diferença, porque pra cada tipo de dado tu tem um byte pelo menos a mais, nos tipos numéricos então, vou só fazer um comparativo pra tu entender a diferença de uso de bytes:

 

 

                                                 Captura de tela de 2016-04-28 09:17:54.png                                                  Captura de tela de 2016-04-28 09:13:41.png

 

Como eu disse, em baixa escala não faz diferença, mas em larga escala faz uma diferença absurda. Não leve isso como algo pejorativo, meu intuito é somente atribuir uma informação que julgo ser importante.

Sim brother, eu entendi a idéia que passou, aliás, eu curti bastante. Eu vou recriar esse sistema usando o chamado "jeito certo da coisa". Obrigado ^^

BananaFightB
30 de abril de 2016 às 01:36

 

Você deveria usar o seu conhecimento sobre o tibia como base para fazer um novo jogo, Entender como um server se comunica com o client deve ser fácil para você, é como o dalv falou, seu jeito em grande escala vai causar muito processamento.

 

 

 

 

 

Uma dica, fugir de algo porque ele é complicado não é algo produtivo, você deve enfrentar as dificuldades com a cabeça erguida e vontade, assim você passa por elas mas não precisa fazer seu trabalho duas vezes, acho que se você pular o aprendizado sobre bytes depois ficar sem entender o porque dos seus programas usarem muito recurso da maquina. 

 

 

 

 

 

Boa sorte com o projeto.

 

 

1 mês depois...
Felipe MoraesF
07 de maio de 2016 às 12:03

Aproveitando o assunto, mas não falando especificadamente de você... Parece que hoje em dia uma boa parte dos programadores não se preocupam mais com a performance dos sistemas. Depois que o fluxo de dados cresce e começa o gargalo, apenas dizem para aumentar o poder de hardware.

Lembro vagamente de uma época onde recursos de hardware eram mais escassos, e os programadores tinham que se preocupar com cada linha de seu código a fim de gerenciar melhor seu desempenho.

Mas fico feliz que ainda exista aqueles que se preocupam com uma boa performance para seus sistemas.

 

---

Sobre o tópico, embora não tenha visto o código, acho sempre válido ajudar a comunidade. Espero que continue assim.

Parabéns e obrigado por compartilhar.