Sockets em Python

Publicado por Bruno Gola 25/10/2006

[ Hits: 23.440 ]

Download sockets.py




Este script funciona como cliente/servidor para exemplificar o uso de sockets em Python.

Espero que esteja fácil de entender :-)

  



Esconder código-fonte

#!/usr/bin/python
# -*- coding: iso8859-1 -*-

"""
Este script serve para exemplificar o uso de sockets em python para o trafego de dados em rede.
É bem simples, nele estão definidos o servidor e o clinete (que são habilitados de acordo com os argumentos durante a chamada na linha de comando.

Exemplo:

$ ./sockets.py -s 9099      # Isso em um terminal

$ ./sockets.py -c localhost 9099        # Em outro terminal

Simples assim.
Lembrando que funciona em rede também, ou seja, você pode rodar o servidor em uma maquina e o client em outra.

Para ter ajuda basta digitar ./sockets.py -h

Bruno Gola < brunogola em gmail ponto com >
"""


""" Módulo necessário para utilização de sockets"""
from socket import *

""" Módulos para receber argumentos via linha de comando e sair do programa (exit) """
from sys import argv,exit

def conecta(ip,porta):
    """ Esta função recebe um ip e uma porta e faz a conexão"""

    sock = socket(AF_INET,SOCK_STREAM) # Criação do socket
    sock.connect((ip,int(porta))) # Conexão com o servidor
    return sock

def server():
    """ Esta função abre um servidor que fica esperando por conexões de rede na porta definida. """
    NUMERO_CONEXOES = 1 # Número de conexões que o server aceitara

    if len(argv) < 3:
        usage()
        exit(1)

    sock = socket(AF_INET,SOCK_STREAM)  #   Criação do socket do servidor
    sock.bind(("localhost",int(argv[2])))   #   Faz o socket escutar no ip "localhost" e porta passado no argumento
    sock.listen(NUMERO_CONEXOES)    #   Escuta até NUMERO_CONEXOES conexões
    client = sock.accept()  #   Aceita e espera por conexões
    new_sock = client[0]    #   client[0] contém o socket para a conexão aberta,
    ip = client[1][0] # client[1] contém uma tupla com informações sobre o client no formato (ip,porta)
    print "Cliente conectado.\nInformações:\n\tIP: %s" % ip
    print "O Server está de pé, esperando por mensagens. CTRL+C para derrubar o server.\n"
    BY = 1024
    try:
        msg = True
        while msg != None:
            msg = new_sock.recv(BY)   #   Recebe uma mensagem pelo socket aberto, recebe até BY bytes
            print "Mensagem recebida de %s -> %s" % (ip,msg)
    except KeyboardInterrupt:   #   Trata o CTRL+C
        print "Saindo..."
        exit(0)

def client():
    """ Função que representa o cliente, conecta no servidor e interage com o usuário """
    if len(argv) < 4:
        usage()
        exit(1)
    sock = conecta(argv[2],argv[3]) #   Conecta
    try:
        while True:
            msg = raw_input("Digite sua mensagem (para sair pressione ctrl+c): ")
            sock.send(msg)  # Envia a mensagem

    except KeyboardInterrupt:   #   Trata o CTRL+C
        sock.send("{FONTE}")
        print "Saindo..."
        exit(0)

def usage():
    print "Uso: %s options [ip] [porta]\n\n\t-s abre o programa como servidor, especifique a porta\n\t-c abre o programa como client, especifique o ip e a porta" % argv[0]


if __name__ == "__main__":
    args = ("-s","-c","-h")
    if len(argv) < 2 or argv[1] not in args or argv[1] == "-h":
        usage()
        exit(1)

    if argv[1] == args[0]:
        print "Executando o server.\n"
        server()

    elif argv[1] == args[1]:
        print "Executando o cliente.\n"
        client()

    exit(0)

Scripts recomendados

Busca IP externo

Aplicação gráfica para Wake-on-LAN com Python 3 + GUI Tk/Tcl

Shell Reverso em Python

Validação de IP

B.S.A.N.S. - Break Security - Automated Network Scanner [PARTE 1]


  

Comentários
[1] Comentário enviado por hugobcar em 23/05/2007 - 09:23h

Bom dia Bruno, estou começando a mexer com python agora, e sockets também, estou tendo problemas ao executar o script, será que você pode me dar uma ajuda ?

Segue o erro na hora de executar: ./sockets.py -h

" Traceback (most recent call last):
File "./sockets.py", line 25, in ?
from socket import *
File "./socket.py", line 4, in ?
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
AttributeError: 'module' object has no attribute 'AF_INET' "


Tem alguma diferença de rodar em versões do python ? Qual você está usando ?


Valeu

[2] Comentário enviado por vndmtrx em 03/05/2008 - 15:32h

Seguinte. Como você está usando "from socket import *", vc não precisa usar socket.AF_INET, pode usar AF_INET diretamente.

[3] Comentário enviado por franklin.farias em 24/09/2013 - 20:51h

Se porventura apresentar erro "Connection refused" alterar a linha:
sock.bind(("localhost",int(argv[2])))
para
sock.bind(('',int(argv[2])))

Isto vai resolver.


Contribuir com comentário