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.