Sockets em Python

Neste tutorial, vou criar uma aplicação estilo Messenger (cliente - servidor) e enviar as mensagens na rede fazendo o uso
de Sockets.

[ Hits: 35.946 ]

Por: Alisson Machado em 28/03/2012


Sockets em Python



Sockets são usados para enviar dados através da rede, um exemplo seria enviar um arquivo pelo MSN, ou até mesmo as mensagens. Nesse tutorial, vou criar uma aplicação estilo messenger, cliente - servidor, e enviar as mensagens na rede fazendo o uso de Sockets.

Um grande erro que alguns programadores comentem, é achar que os Sockets são da linguagem de programação, quando na realidade, já são do próprio Sistema Operacional, precisamos somente saber como usa-los.

Como saber um pouco mais sobre Socket em qualquer Linux, é só usar o comando:

man socket

Essa é a documentação que te dá uma visão geral sobre o seu uso e suas funções, depois é só adaptar conforme a linguagem de programação que estiver usando.

Aplicação do lado Servidor

Primeiro, vamos criar o servidor que vai receber as mensagens da nossa aplicação Client.

#########=====serv_tuto.py=====########## #!/user/bin/python # # Coded by: Alisson Menezes [kernelcrash] # # servidor que recebe mensagens de aplicação client parecido com o netsend # # import socket host = '' port = 7000 addr = (host, port) serv_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serv_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) serv_socket.bind(addr) serv_socket.listen(10) print 'aguardando conexao' con, cliente = serv_socket.accept() print 'conectado' print "aguardando mensagem" recebe = con.recv(1024) print "mensagem recebida: "+ recebe serv_socket.close() #############=====EOF======###################


Explicando um pouco as linhas acima:

serv_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

- Nesta, criamos o nosso mecanismo de Socket para receber a conexão, onde na função passamos 2 argumentos, AF_INET que declara a família do protocolo; se fosse um envio via Bluetooth por exemplo, seria: AF_BLUETOOTH, SOCKET_STREAM, indica que será TCP/IP.

serv_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

- Essa linha serve para zerar o TIME_WAIT do Socket, por exemplo, se o programa estiver aguardando uma conexão e você der CTRL+C para interromper, o programa fecha porém o Socket continua na escuta e se você for usar a mesma porta receberá a seguinte mensagem:
socket.error: [Errno 98] Address already in use

serv_socket.bind(addr)

- Esta linha define para qual IP e porta o servidor deve aguardar a conexão, que no nosso caso é qualquer IP, por isso o Host é ''.

serv_socket.listen(10)

- Define o limite de conexões.

con, cliente = serv_socket.accept()

- Deixa o Servidor na escuta aguardando as conexões, feita a conexão vem o seguinte comando:

recebe = con.recv(1024)

Que aguarda um dado enviado pela rede de até 1024 Bytes, a função 'recv' possui somente 1 argumento que é o tamanho do Buffer.

Aplicação do lado Cliente

Agora, vamos criar a aplicação cliente para testar o nosso Servidor:

############## client_tuto.py################# #!/usr/bin/python #Coded by: Alisson Menezes [kernelcrash] # import socket ip = raw_input('digite o ip de conexao: ') port = 7000 addr = ((ip,port)) client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(addr) mensagem = raw_input("digite uma mensagem para enviar ao servidor") client_socket.send(mensagem) print 'mensagem enviada' client_socket.close() ############=----EOF----###########


A maioria das linhas do nosso programa Client já foi descrita no Servidor, pois são apenas alguns ajustes para se fazer o uso do Socket, neste segundo programa, a única diferença são as linhas:

client_socket.connect(addr)

- Que faz a conexão no nosso servidor.

client_socket.send(mensagem)

- Que faz o envio do dado para servidor.

client_socket.close()

- Serve para fechar a conexão entre os dois aplicativos.

Bem, acho que um resumão sobre Socket em Python.

É isso aí, em breve faço um novo tutorial fazendo o uso de Threads.

KernelCrash: Boteco Unix
   

Páginas do artigo
   1. Sockets em Python
Outros artigos deste autor

Python + ADB

MongoDB Aggregation

Sincronizando Dados do PostgreSQL no Elasticsearch

Vault: SSH com OneTimePassword

Python Flask Básico

Leitura recomendada

Introdução a Threads e como implementá-las em Python

Threads - Importância dentro de um software

Monitorando produtos no ML com Python 3 via BeautifulSoup

ISO8583py - Utilizando Python para o tratamento de mensagens ISO8583

Introdução ao clib (Command Line Book)

  
Comentários
[1] Comentário enviado por andrezc em 29/03/2012 - 08:49h

Ótimo artigo! Não programo em Python, mas gostei de ver a simplicidade desta, com relação à sockets. Me lembra Ruby, onde faz-se muito, usando pouco código.

[2] Comentário enviado por marquinhos1875 em 01/04/2012 - 22:52h

Ótimo cara!
Parabéns pelo artigo, caiu como luva.

[3] Comentário enviado por mbmaciel em 02/04/2012 - 17:13h

funciona 100%. Muito bom !

[4] Comentário enviado por fabio_lae em 03/04/2012 - 23:07h

Nunca usei Python, mas rodando tive os seguintes erros:

./serv_tuto.py
./serv_tuto.py: line 9:  : command not found
./serv_tuto.py: line 11:  : command not found
host: couldn't get address for '': not found
./serv_tuto.py: line 13: port: command not found
./serv_tuto.py: line 14:  : command not found
./serv_tuto.py: line 15: syntax error near unexpected token `('
./serv_tuto.py: line 15: `addr = (host, port)'

Alguma sugestao?

Abracos,

[5] Comentário enviado por fhferreira1 em 06/06/2012 - 12:14h

No Windows como deixo o server rodando em background ?

[6] Comentário enviado por AlissonMMenezes em 12/10/2012 - 07:48h

Vish mano xD

Em windows eu não sei não, mas no linux dá pra fazer uma gambi, você para o processo usando CTRL+Z e depois dá um bg, dai a tarefa fica rodando em background

[7] Comentário enviado por rogue_psycho em 15/10/2015 - 18:50h

Maravilhoso artigo, me deu uma ótima noção de Sockets.

[8] Comentário enviado por haskellmb em 18/11/2015 - 16:29h

simplesmente ótimo, estou trabalhando/estudando um método de transferência de arquivos via sockets porem não estou tendo sucesso nas tentativas e estudos... alguém pode acender a lamparina no fim do túnel?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts