O soquete e seus métodos

Os soquetes são os pontos finais de um canal de comunicação bidirecional. Eles podem se comunicar dentro de um processo, entre processos na mesma máquina ou entre processos em máquinas diferentes. Em uma observação semelhante, um soquete de rede é um ponto final em um fluxo de comunicação entre dois programas executados em uma rede de computadores, como a Internet. É uma coisa puramente virtual e não significa nenhum hardware. O soquete de rede pode ser identificado por uma combinação única de endereço IP e número de porta. Os soquetes de rede podem ser implementados em vários tipos de canais diferentes, como TCP, UDP e assim por diante.

Os diferentes termos relacionados ao soquete usado na programação de rede são os seguintes -

Domínio

Domínio é a família de protocolos usada como mecanismo de transporte. Esses valores são constantes como AF_INET, PF_INET, PF_UNIX, PF_X25 e assim por diante.

Tipo

Tipo significa o tipo de comunicação entre dois pontos de extremidade, normalmente SOCK_STREAM para protocolos orientados à conexão e SOCK_DGRAM para protocolos sem conexão.

Protocolo

Isso pode ser usado para identificar uma variante de um protocolo dentro de um domínio e tipo. Seu valor padrão é 0. Isso geralmente é omitido.

nome de anfitrião

Isso funciona como o identificador de uma interface de rede. Um nome de host pode ser uma string, um endereço quádruplo com pontos ou um endereço IPV6 em notação de dois pontos (e possivelmente um ponto).

Porta

Cada servidor escuta os clientes chamando em uma ou mais portas. Uma porta pode ser um número de porta Fixnum, uma string contendo um número de porta ou o nome de um serviço.

Módulo de soquete do Python para programação de soquete

Para implementar a programação de socket em python, precisamos usar o módulo Socket. A seguir está uma sintaxe simples para criar um Socket -

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

Aqui, precisamos importar a biblioteca de soquetes e então fazer um soquete simples. A seguir estão os diferentes parâmetros usados ​​ao fazer o soquete -

  • socket_family - Este é AF_UNIX ou AF_INET, conforme explicado anteriormente.

  • socket_type - Este é SOCK_STREAM ou SOCK_DGRAM.

  • protocol - Isso geralmente é deixado de fora, com o padrão de 0.

Métodos de soquete

Nesta seção, aprenderemos sobre os diferentes métodos de soquete. Os três conjuntos diferentes de métodos de soquete são descritos abaixo -

  • Métodos de soquete de servidor
  • Métodos de soquete de cliente
  • Métodos Gerais de Soquete

Métodos de soquete de servidor

Na arquitetura cliente-servidor, há um servidor centralizado que fornece serviço e muitos clientes recebem serviço desse servidor centralizado. Os clientes também fazem a solicitação ao servidor. Alguns métodos de soquete de servidor importantes nesta arquitetura são os seguintes -

  • socket.bind() - Este método associa o endereço (nome do host, número da porta) ao soquete.

  • socket.listen()- Este método basicamente escuta as conexões feitas ao soquete. Ele inicia o listener TCP. Backlog é um argumento deste método que especifica o número máximo de conexões enfileiradas. Seu valor mínimo é 0 e o valor máximo é 5.

  • socket.accept()- Isso aceitará a conexão do cliente TCP. O par (conn, address) é o par de valores de retorno deste método. Aqui, conn é um novo objeto de soquete usado para enviar e receber dados na conexão e endereço é o endereço vinculado ao soquete. Antes de usar este método, os métodos socket.bind () e socket.listen () devem ser usados.

Métodos de soquete de cliente

O cliente na arquitetura cliente-servidor solicita o servidor e recebe serviços do servidor. Para isso, existe apenas um método dedicado aos clientes -

  • socket.connect(address)- este método conecta ativamente ao servidor íntimo ou em palavras simples este método conecta o cliente ao servidor. O argumento address representa o endereço do servidor.

Métodos Gerais de Soquete

Além dos métodos de soquete de cliente e servidor, existem alguns métodos de soquete gerais, que são muito úteis na programação de soquetes. Os métodos gerais de soquete são os seguintes -

  • socket.recv(bufsize)- Como o nome indica, este método recebe a mensagem TCP do socket. O argumento bufsize significa tamanho do buffer e define o máximo de dados que esse método pode receber a qualquer momento.

  • socket.send(bytes)- Este método é usado para enviar dados para o soquete que está conectado à máquina remota. O argumento bytes fornecerá o número de bytes enviados para o socket.

  • socket.recvfrom(data, address)- Este método recebe dados do soquete. O valor de dois pares (dados, endereço) é retornado por este método. Os dados definem os dados recebidos e o endereço especifica o endereço do soquete que envia os dados.

  • socket.sendto(data, address)- Como o nome indica, este método é usado para enviar dados do soquete. O valor de dois pares (dados, endereço) é retornado por este método. Os dados definem o número de bytes enviados e o endereço especifica o endereço da máquina remota.

  • socket.close() - Este método fechará o soquete.

  • socket.gethostname() - Este método retornará o nome do host.

  • socket.sendall(data)- Este método envia todos os dados para o soquete que está conectado a uma máquina remota. Ele transferirá os dados descuidadamente até que ocorra um erro e se isso acontecer, ele usa o método socket.close () para fechar o socket.

Programa para estabelecer uma conexão entre servidor e cliente

Para estabelecer uma conexão entre o servidor e o cliente, precisamos escrever dois programas Python diferentes, um para servidor e outro para cliente.

Programa do lado do servidor

Neste programa de soquete do lado do servidor, usaremos o socket.bind()método que o liga a um endereço IP e porta específicos para que ele possa ouvir as solicitações de entrada nesse IP e porta. Mais tarde, usamos osocket.listen()método que coloca o servidor no modo de escuta. O número, digamos 4, como o argumento dosocket.listen()método significa que 4 conexões são mantidas em espera se o servidor estiver ocupado e se um quinto soquete tentar se conectar, a conexão será recusada. Enviaremos uma mensagem ao cliente usando osocket.send()método. No final, usamos osocket.accept() e socket.close()método para iniciar e fechar a conexão, respectivamente. A seguir está um programa do lado do servidor -

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

Programa do lado do cliente

No programa de soquete do lado do cliente, precisamos fazer um objeto de soquete. Em seguida, conectaremos à porta em que nosso servidor está sendo executado - 12345 em nosso exemplo. Depois disso, vamos estabelecer uma conexão usando osocket.connect()método. Então, usando osocket.recv()método, o cliente receberá a mensagem do servidor. Enfim, osocket.close() método fechará o cliente.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

s.close()
print (msg.decode('ascii'))

Agora, depois de executar o programa do lado do servidor, obteremos a seguinte saída no terminal -

socket is listening
Got connection from ('192.168.43.75', 49904)

E depois de executar o programa do lado do cliente, obteremos a seguinte saída em outro terminal -

Connection Established

Tratamento de exceções de soquete de rede

Existem dois blocos, a saber try e exceptque pode ser usado para lidar com exceções de soquete de rede. A seguir está um script Python para lidar com a exceção -

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

Resultado

O programa acima gera a seguinte saída -

No connection between client and server

No script acima, primeiro criamos um objeto socket. Em seguida, forneceu o endereço IP do host e o número da porta em que nosso servidor está sendo executado - 12345 em nosso exemplo. Mais tarde, o bloco try é usado e dentro dele usando osocket.bind()método, vamos tentar vincular o endereço IP e a porta. Nós estamos usandosocket.settimeout()método para definir o tempo de espera do cliente, em nosso exemplo estamos definindo 3 segundos. O bloco except é usado, o qual irá imprimir uma mensagem se a conexão não for estabelecida entre o servidor e o cliente.