Programação de Rede em Python: Sockets e Protocolos Avançados
Python oferece dois níveis de acesso a serviços de rede: baixo nível (sockets do SO) para protocolos orientados a conexão (TCP) e sem conexão (UDP), e alto nível (bibliotecas como ftplib, urllib) para protocolos de aplicação (FTP, HTTP, etc.).
O que são Sockets?
Sockets são pontos finais de um canal de comunicação bidirecional. Podem comunicar entre processos na mesma máquina ou em continentes diferentes. Implementados sobre diversos tipos de canal: Unix domain, TCP, UDP, etc.
Vocabulário de Sockets
| Termo | Descrição |
|---|---|
| Domínio | Família de protocolos (ex.: AF_INET, AF_UNIX). |
| Tipo | SOCK_STREAM (TCP) ou SOCK_DGRAM (UDP). |
| Protocolo | Geralmente 0; variante dentro do domínio/tipo. |
| Hostname | Identificador da interface: nome, IP, <broadcast>, string vazia (INADDR_ANY) ou inteiro. |
| Porta | Número da porta, string com número ou nome do serviço. |
Módulo socket
Criação de socket:
s = socket.socket(socket_family, socket_type, protocol=0)
socket_family:AF_UNIXouAF_INET.socket_type:SOCK_STREAMouSOCK_DGRAM.protocol: geralmente omitido (default 0).
Métodos do Socket Servidor
| Método | Descrição |
|---|---|
s.bind((host, porta)) | Associa endereço (host, porta) ao socket. |
s.listen(fila) | Inicia listener TCP com tamanho de fila. |
s.accept() | Aceita conexão TCP cliente (bloqueante). |
Métodos do Socket Cliente
| Método | Descrição |
|---|---|
s.connect((host, porta)) | Inicia conexão TCP ativa. |
Métodos Gerais
| Método | Descrição |
|---|---|
s.recv(bufsize) | Recebe mensagem TCP. |
s.send(bytes) | Transmite mensagem TCP. |
s.recvfrom(bufsize) | Recebe mensagem UDP. |
s.sendto(bytes, endereco) | Transmite mensagem UDP. |
s.close() | Fecha o socket. |
socket.gethostname() | Retorna nome do host local. |
Servidor Simples
#!/usr/bin/python
import socket
s = socket.socket()
host = socket.gethostname()
porta = 12345
s.bind((host, porta))
s.listen(5)
while True:
conn, addr = s.accept()
print('Conexão de', addr)
conn.send(b'Obrigado por conectar')
conn.close()
Cliente Simples
#!/usr/bin/python
import socket
s = socket.socket()
host = socket.gethostname()
porta = 12345
s.connect((host, porta))
print(s.recv(1024).decode())
s.close()
Execute o servidor em background (python servidor.py &) e depois o cliente.
Módulos de Internet de Alto Nível
| Protocolo | Função Comum | Porta | Módulo Python |
|---|---|---|---|
| HTTP | Páginas web | 80 | http.client, urllib, xmlrpc.client |
| NNTP | Notícias Usenet | 119 | nntplib |
| FTP | Transferência de arquivos | 20/21 | ftplib, urllib |
| SMTP | Envio de e-mail | 25 | smtplib |
| POP3 | Recebimento de e-mail | 110 | poplib |
| IMAP4 | Recebimento de e-mail | 143 | imaplib |
| Telnet | Linhas de comando | 23 | telnetlib |
| Gopher | Transferência de documentos | 70 | gopherlib, urllib |
Para aprofundamento, consulte Unix Socket Programming e a documentação da Python Socket Library.
python
- Dominando Tipos de Dados em Python: Guia Prático
- Dominando Operadores em Python: Guia Completo
- Dominando a Declaração Pass em Python: Guia Prático
- Dominando Argumentos de Funções em Python: Parâmetros Posicionais, Nomeados e Padrão
- Dominando Dicionários em Python: Criação, Manipulação e Técnicas Avançadas
- Dominando Programação Orientada a Objetos em Python: Classes, Herança, Encapsulamento e Polimorfismo
- Dominando Iteradores em Python: Como Funcionam e Como Criar os Seus
- Closures em Python Explicados: Como Funções Aninhadas Capturam Variáveis
- Dominando datetime do Python: Guia Prático de Datas, Horários e Fusos Horários
- Dominando time.sleep() do Python: Boas Práticas, Multithreading e Exemplos Reais