Programação

terça-feira, 12 de maio de 2020

M6 - SOCKETs

MODELO OSI

modelo OSI ( Open Systems Interconnection ) está dividido em 7 camadas

arquitetura padrão para a comunicação entre dois dispositivos dentro de uma rede



MODELO OSI – PROTOCOLOS




            MODELO OSI      versus                 TCP/IP  (atual)



Modelo Cliente/Servidor 
● em geral, uma aplicação que inicia uma comunicação par-a-par é chamada cliente
● um servidor é um programa que espera por requisições de um cliente.

Comunicação entre aplicação cliente e aplicação servidor 
Cliente e servidor usam comunicação entre processos (IPC - inter-process communication) para conversar entre si. 
Há vários mecanismos de IPC  -    um deles é o sockets  
Sockets - API padrão para TCP/IP IPC


SOCKETS

Socket é um mecanismo de comunicação bidirecional mais usado para implementar um modelo cliente/servidor, e permite a troca de mensagens em Tempo Real entre os processos de uma máquina/aplicação servidor e os processos de uma máquina/aplicação cliente.


Socket é a "interface" que permite a comunicação entre o processo do servidor e o processo cliente através de um rede.




ExemplosCHAT,   Jogos Mutiplayer;  Reservas online



A aplicação servidor que serve de "chat" irá receber  ligações dos clientes (numa determinada porta) e posteriormente, se um cliente enviar uma mensagem, o servidor envia essa mensagem para todos os outros clientes.


O processo de comunicação: 

- o servidor é colocado numa determinada porta e aguarda por ligações a essa porta. 
- O cliente deve saber previamente qual o nome ou IP do servidor e a respetiva porta onde o servidor foi colocado à espera de ligações
- Então o cliente solicita uma ligação ao servidor/porta conforme demonstra a figura seguinte.

o servidor aceita a ligação gerando um socket numa porta vaga do lado do servidor, criando assim um canal de comunicação entre o cliente e o servidor.  

O servidor fica em loop, aguardando novas ligações e “gerando” sockets para atender as solicitações de clientes.
                          ---------------------------------------------------------------------


 TIPOS DE SOCKETS de REDE

 
representação de um socket de rede dá-se pela informação ip:porta 


Por exemplo:         127.0.0.1:4477 (IPv4). 



Na comunicação de computadores há 2 coisas que devemos saber: 

endereço IP (que identifica univocamente uma máquina) e a porta (que identifica a aplicação)




Sabendo que TCP/IP é a base da comunicação na internet, considerando o modelo de rede OSI:

      os Sockets atuam entre a camada de Aplicação e a camada de Transporte.






Os Sockets são utilizados na camada de Transporte por protocolos como o TCP UDP 

  TCP ( Transmission Control Protocol)  UDP (User Datagram Protocol )



Dois principais tipos de sockets: 

 - SOCKET_STREAM ( TCP)    
     
-  SOCK_DGRAM   (UDP). 


Stream Sockets (SOCK_STREAM): Esse tipo usa o protocolo TCP que é mais fiável, pois há garantia de entrega e ordem, é orientado à conexão etc;

Datagram Sockets (SOCK_DGRAM): Esse tipo usa o protocolo UDP, portanto, não é orientado à conexão, não garante entrega completa dos dados e exige um controle mais especial do desenvolvedor.


DIFERENÇA entre TCP vs UDP


- Os sockets TCP garantem fiabilidade na comunicação (garantia da entrega de pacotes entre o emissor e o receptor),

- os sockets UDP não dão garantia na entrega de pacotes a nível da camada de transporte). 
há mais velocidade e menos controle, associamos o protocolo IP ao UDP (tráfego de voz e vídeo são bons exemplos onde o UDP teria boa aplicabilidade, ademais, perdendo um ou outro pacote, não interfere totalmente no todo, permanecendo inteligível).



PORTAS

Existem milhares de portas (estas são codificadas em 16 bits, há por conseguinte, 65536 possibilidades)   

Existem diferentes tipos de números de portas

  • Portas Bem-conhecidas, de 0 a 1023. Atribuídas e controladas pelo ICANN
  • Portas Registradas, de 1024 a 49151. Não atribuídas nem controladas pelo ICANN, mas podem ser registradas para evitar duplicação

  • Portas Dinâmicas, Privadas ou Efêmeras, de 49152 a 65535. Não atribuídas nem controladas. Em tese, os sistemas clientes deveriam apenas usar portas desta faixa, mas na prática essa recomendação não é seguida.
estgp cisco 



Verificar portas TCP / IP abertas no Windows


comando netstat 


SINTAXE 
netstat [-a] [-b] [-e] [-n] [-o] [-p <Protocol>] [-r] [-s] [<interval>]
 
-a  Exibe todas as conexões TCP ativas e as portas TCP e UDP nas quais o computador está escutando
-n  Exibe conexões TCP ativas, no entanto, os endereços e os números de porta são expressos numericamente e nenhuma tentativa é feita para determinar nomes
-o  Exibe conexões TCP ativas e inclui a ID do processo (PID) para cada conexão. Você pode encontrar o aplicativo com base no PID na guia Processos no Windows gestor de Tarefas. Esse parâmetro pode ser combinado com -a-n e -p
 



São visualizadas Portas TCP e portas UDP


Criação de Sockets TCP 





 




RESUMO

Sockets são uma interface de programação que permite a comunicação bidirecional e em tempo real entre processos em diferentes dispositivos através de uma rede.


Os sockets funcionam em um modelo cliente-servidor, onde um processo atua como o servidor, aguardando por conexões, e outros processos agem como clientes, solicitando a conexão ao servidor.

Tipos de sockets :
  1. Sockets TCP (Transmission Control Protocol): Fornecem uma comunicação confiável e orientada à conexão. A transmissão é estabelecida antes que os dados sejam trocados, garantindo que a informação seja recebida na ordem correta e sem perdas.


  2. Sockets UDP (User Datagram Protocol): Oferecem uma comunicação mais simples e menos confiável, sem a garantia de entrega ou ordem dos pacotes.


Em PHP, pode-se criar uma comunicação via sockets utilizando as funções socket_create(), socket_bind(), socket_listen(), socket_accept(), socket_read(), e socket_write()

EXEMPLO de uma comunicação entre SOCKET SERVIDOR e um SOCKET CLIENTE

Vamos compreender as funções em PHP utilizadas



FUNÇÕES EM PHP  (Socket Servidor) 

1.   Criar socket 

SINTAXE:       socket_create(int $domainint $typeint $protocol): Socket|false´



domain 
AF_INETProtocolos baseados na Internet IPv4TCP e UDP são protocolos comuns desta família de protocolos.
AF_INET6Protocolos baseados na Internet IPv6. TCP e UDP são protocolos comuns desta família de protocolos.
AF_UNIXFamília de protocolos de comunicação local. Alta eficiência e baixa sobrecarga tornam uma ótima forma de IPC (Interprocess Communication).
 type
SOCK_STREAMFornece fluxos de bytes sequenciados, confiáveis, full-duplex e baseados em conexão.
 
Um mecanismo de transmissão de dados fora de banda pode ser suportado. O protocolo TCP é baseado nesse tipo de socket.
SOCK_DGRAMSuporta datagramas (mensagens não confiáveis ​​e sem conexão de comprimento máximo fixo). 
 protocolo UDP é baseado nesse tipo de socket.
protocol
Caso o protocolo desejado seja TCP, ou UDP as constantes correspondentes SOL_TCPSOL_UDP também podem ser utilizadas.


 
Exemplo:
                      $socket_servidor = socket_create (AF_INET ,  SOCK_STREAM,  SOL_TCP); 





2.Associar ao socket  

               socket_bind ( Socket $socket , string $address , int $port= 0 ): bool


Exemplo:  
                    socket_bind ($socket_servidor ,  ’127.0.0.1’,   50000  );



3.  Esperar por clientes (nºclientes)
                  socket_listen(Socket $socketint $backlog = 0): bool

Exemplo
                            socket_listen ($socket_servidor,  1  );


4. 
Aceitar clientes  
            socket_accept(Socket $socket): Socket|false

 Exemplo:    
                        $client_socket = socket_accept ($socket_servidor);


5. Enviar / Receber informação via socket

Enviar/Escrever
        socket_write(Socket $socketstring $data?int $length = null): int|false

Exemplo:
               $msg="Mensagem enviada via Socket!\n"
               socket_write ($client_socket$msg ,   strlen($msg)    );

               Função strlen(string)  - determina o tamanho da string 


Leitura/Receber

 socket_read(Socket $socketint $lengthint $mode = PHP_BINARY_READ): string|false

length    O número máximo de bytes lidos é especificado pelo length parâmetro. 
mode (opcional) PHP_NORMAL_READ - a leitura pára em \n ou \r.


Exemplo:        $msgrecebida= socket_read ($client_socket,  1024,  PHP_NORMAL_READ);

                        $msgrecebida= socket_read ($socket_servidor,  1024,  PHP_NORMAL_READ);


6.  Destruir o socket 
     socket_close(Socket $socket): void


Exemplo:   socket_close ($socket _servidor);
                    socket_close ($client_socket );
  


6. Inicia a conexão a um socket (CLIENTE)

socket_connect(Socket $socketstring $address?int $port = null): bool

Exemplo socket_connect($socket, '127.0.0.1', 50000 );


  
RESUMO

O socket servidor é iniciado e ficará à espera de pedidos dos clientes numa porta específica
Depois o cliente estabelece a ligação (usando o IP do servidor e a porta) e, se tudo correr bem, o cliente servidor passam a trocar informações entre eles.
No final da troca de mensagens, o cliente e o servidor fecham a comunicação.

-----------------------------------------------------------------------------------------------------------------------

OUTRAS INFORMAÇÕES SOBRE SOCKETS


Sockets em Java  http://www4.pucsp.br/~jarakaki/lp4/ProgramacaoSockets.pdf 





Sockets  versus WebSockets

Sockets é um termo mais genérico

WebSockets são utilizados quando se pretende uma comunicação bidirecional em Tempo Real entre um servidor Web e um cliente(Browser). 











Como funciona um websocket  ver Vídeo 

https://www.youtube.com/watch?v=T4unNrKogSA



Aplicações em que são utilizados Websockets 
        Chat Apps
        Multi-players Games
        Real Time Data Analytis
        Social Media (facebook, CNN )


WebSockets que utilizam a biblioteca Socket.io que permite criar projetos fantásticos, com comunicações em tempo real.

Exemplo criação de um CHAT - NodeJS e a biblioteca Socket.io


Chat Application in PHP 








--------------------------------------------------------------------------------


INICIAÇÃO À PROGRAMAÇÃO de SOCKETS  

podem utilizar site do PHP para consultar informações sobre as funções   https://www.php.net/manual/pt_BR/ref.sockets.php


Vamos começar por:

-- correr o programa em php "Server1.php" em linha de comandos  e fazer uma ligação com o servidor usando o telnet (protocolo utilizado para conexão remota)

- correr o programa em php "Server1.php" em linha de comandos e fazer uma ligação com o servidor utilizando o Putty (software utilizado para aceder remotamente, utiliza o protocolo telnet ou SSH)


NOTA
-->Na Escola devido ao condicionamento da rede temos necessidade de criar Virtual Machine windows 8 para utilizarmos os SOCKETS.


-->Nos PC's dos alunos 
  1. vamos ativar Telnet no Windows 
  2. Elaborar código no VSCode e Corrigir o erro: extensão php  - ficheiro php.ini  (extension=sockets)  (ver mais abaixo)
  3. instalar o Putty (www.putty.org

 1. DEVE ATIVAR O TELNET no seu computador





































2. ESCREVER CÓDIGO DO SERVIDOR  "server1.php"




INTERPRETAR O CÓDIGO em PHP 

Depois de escrever o código, vai ter que utilizar o php.exe (pasta c:xampp\php) para interpretar o código php.


Abrir uma janela em linha comandos




entrar na pasta xampp\php    (cd c:\xampp\php)
Deve digitar  php -f e o caminho do ficheiro em php  (  php -f  path do ficheiro )

para copiar o path  e colar 






CORRIGIR ERRO PHP (Uncaugth Error) - Extensões do PHP

Para corrigir este erro, tem que alterar uma instrução do ficheiro php.ini

Editar Ficheiro php.ini  (c:\xampp\php)

Localizar instrução  ;extension =sockets  retirar o ponto e vírgula ;  , ou seja, 
onde estava  ;extension =sockets   fica apenas  extension =sockets          


Salvar



Interpretar novamente o código server1.php


SERVIDOR                  -----------------------                -----------------                         CLIENTE: 



O SERVIDOR informa que estabeleceu ligação e fica à espera de conexões de clientes


vamos estabelecer uma conexão através do Telnet

Noutra janela em linha de comando, o cliente vai ligar ao servidor através do telnet 
telnet ip porta   ou seja   telnet 127.0.0.1  12345

Quando o cliente faz a ligação com o servidor, este envia as 2 frases que foram programadas para o cliente; e a ligação é terminada







ABRIR 2 JANELAS DE LINHA DE COMANDOS


No XAMPP

Numa janela em linha de comandos: interpretar código PHP

Ir para a pasta cd c:\xampp\php
digitar:                   php -f  c:\xampp\htdocs\pasta\nomeficheiro.php

 
Segunda Janela em linha de comandos: estabelecer conexão com os servidor através do telnet 

escrever   telnet 127.0.0.1  nºporta 
               
telnet 127.0.0.1  12345

(ENTER)



----------------------------------------------------------
WAMPSERVER

Em linha de comandos, digitar o comando para correr o código em php "server1.php"

Interpretador do php:  c:\wamp\bin\php\php7.3.12   (ver qual a sua versão do PHP)

escrever: cd  c:\wamp\bin\php\php7.3.12  (Enter)
                    php -f  path/ficheiro_php 
 
                     php -f   c:\wamp\www\SOCKETS\server1.php







   conexão é estabelecida e é enviada a msg de Bem-vindo ao PHP server sockets V1  e Adeus ... e sai



----------------------------------------------


3. CONEXÃO UTILIZANDO O PUTTY

1º INSTALAÇÃO DO PUTTY 



SERVIDOR: Primeira janela na linha de comandos--> correr código php

CLIENTEAbrir o Putty --> escrever o ip do servidor (127.0.0.1) porta (12345

-->selecionar o protocolo telnet -- > fazer ligação




Resultado :




COMUNICAÇÃO entre SOCKET SERVIDOR E SOCKET CLIENTE 

       código socket servidor                                                                    código socket cliente





--------------------------------------------------------------------------------------------------------------------

Código de um servidor TCP/IP com Mensagens de Erro e LOOP





CHAT em LINHA DE COMANDOS entre Servidor e Cliente 

- para ler da linha de comandos utiliza-se a função fgets (STDIN)

recolhe string inseridos na linha de comandos (STDIN - standard INPUT)

- função trim - retira espaços
- função rtrim — Retira espaço em branco (ou outros caracteres) do final de uma string


código e resultado comunicação




CHAT entre Servidor CMD e Cliente WEB BROWSER




PRECISAM LIGAR XAMPP para CORRER o clientchat.php 



--SERVIDOR:  Abrir janela em linha de comandos --> correr código php do servidor 

-- CLENTE:  Abrir Browser;  URL  digitar  localhost/path/nomeficheiro.php
                        (correr o script clientchat.php)
               - cliente escrever a mensagem para o servidor e enviar
 msg


Irá aparecer mensagem do cliente na janela de linha de comandos 
 
SERVIDOR escrever mensagem para o cliente  (enter) e deverá aparecer no cliente Browser 





Escrever nova msg do Cliente para servidor
       
 
Enviar msg



Servidor: deverá aparecer a frase escrita pelo cliente (aguardar)

Servidor responde   “Sim! Adeus ”  (enter )   e é visualizada no Browser



EXEMPLO: CHAT do MISAEL

Criar Chat em Tempo Real 

2 comentários: