+ Responder ao Tópico



  1. #1

    Padrão socket em python

    boas pessoal, tou mesmu precisando duma grande ajuda! Preciso fazer um programa servidor/cliente em que o servidor receba as mensagens do cliente e as envie para todos os clientes ligados.

    já fiz a mensagem xegar ao servidor, mas não sei como fazer agora o resto! não sei como enviar para os clientes!
    aqui fica o meu código,

    servidor.py:

    Código :
    [B]# -*- coding: cp1252 -*-
    from socket import *
    import time
     
    # Set the socket parameters
    host = "localhost"
    port = 21567
    buf = 1024
    addr = (host,port)
     
    # Create socket and bind to address
    UDPSock = socket(AF_INET,SOCK_DGRAM)
    UDPSock.bind(addr)
     
    # Receive messages
    while 1:
        data,addr = UDPSock.recvfrom(buf)
        t=time.asctime(time.localtime())
        data="ás "+t+' '+data
        print data
        UDPSock.sendto(data,addr)
    # Close socket
    UDPSock.close()
    [/B]
    cliente.py:
    Código :
    [B]from socket import *
     
    # Set the socket parameters
    host = "localhost"
    port = 21567
    buf = 1024
    addr = (host,port)
    nome=raw_input('introduza nome:\t')
    # Create socket
    UDPSock = socket(AF_INET,SOCK_DGRAM)
     
    def_msg = "===introduza o texto===";
    print "\n",def_msg
     
    # Send messages
    while (1):
        data = raw_input(nome+'>> ')
        if not data:
            break
        else:
            data=nome+' diz:\t'+data
            UDPSock.sendto(data,addr)
     
    # Close socket
    UDPSock.close()
    [/B]
    fico aguardando respostas...agradecia imenso que me ajudassem...
    Última edição por uvitkaer; 08-12-2008 às 01:13.

  2. #2

    Padrão

    Olá colega!

    Alguns detalhes no seu programa:

    * Ele só está escutando em localhost (127.0.0.1)
    Aposto que você está rodando o cliente e o servidor na mesma máquina, certo? Como eu sei? Exatamente por causa do localhost. Se você tentar rodar o cliente em uma outra máquina você não vai conseguir se conectar no servidor porque somente a máquina tem acesso ao IP 127.0.0.1. Se não me engano, pro server escutar em todos os IPs basta usar a variável host assim:
    host=""

    * Ele não armazena os clientes que já estabeleceram comunicação com ele.
    Pra você conseguir mandar a mensagem para todos os clientes conectados, primeiro você teria que ter um cliente conectado!! Como assim?! Você está usando o protocolo UDP, ele não é orientado a conexão! Com isso você não tem certeza de quais 'clientes' ainda estão disponíveis. Não entendeu ne?! Vamos fazer uma comparação. Pensa em 2 pessoas se comunicando por carta. Você manda a carta mas não tem certeza nem que a pessoa vai ver essa carta! Você não sabe se ela se mudou ou não... Agora pensa em duas pessoas se comunicando por MSN, ou telefone. Você antes de mandar sua "mensagem" sabe se a pessoa está lá ou não!!
    Mas apesar de tudo tem como fazer o que você quer. É só manter um histórico de todos os clientes que se comunicaram com o servidor.

    * Por utilizar UDP, talvez você tenha alguns problemas
    Como disse acima, você não vai saber quais clientes vão estar "disponíveis" e com isso não tem como saber se o cliente recebeu a mensagem... esse é o grande problema do UDP. Pra contornar isso seria bom utilizar TCP, que é orientado a conexão.


    Como disse antes, tem como fazer, mas tem certas limitações... Se ainda estiver disposta a fazer isso com UDP avisa ai que te dou uma ajuda! Se quiser mudar pra TCP, ai vale a pena você dar uma pesquisada antes ok?!

    Ah, to movendo seu tópico pra área de Python...
    Qualquer coisa posta ai...

  3. #3

    Padrão

    ok, eu vou dar uma olhadela por TCP 1º, depois digo algum resultado. Obrigado pela ajuda!

  4. #4

    Padrão

    Um ótimo site que sempre me ajuda é o PythonBrasil.

    Achei lá uma "receita de bolo" de um servidor TCP. Talvez te ajude. O link é esse: SocketsBasico

    Qualquer dúvida posta ai...

  5. #5

    Padrão

    o tópico está interessante, já converti o meu cliente.py para TCP, e eproveitei o servidor la postado, mas o meu problema continua a ser o mesmo, que é como enviar as mensagens para os clientes, tou numa embrulhada e tenho que fazer o trabalho hoje até às 24h... :S sou um bokado nob nisto e por isso minha dificuldade...

  6. #6

    Padrão

    tou neste estado...

    cliente.py:

    Código :
    import socket
     
    # Set the socket parameters
    host = "127.0.0.1"
    port = 5000
    tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     
    nome=raw_input('introduza nome:\t')
    addr = (host,port)
    tcp.connect(addr)
     
     
    def_msg = "===introduza o texto===";
    print "\n",def_msg
     
    # Send messages
    data = raw_input(nome+'>> ')
    while data <> '\x18':
        data=nome+' diz:\t'+data
        tcp.send(data)
        data = raw_input(nome+'>> ')
    tcp.close()

    servidor.py:

    Código :
    # -*- coding: cp1252 -*-
    import time
    import socket
    import os
    import sys
     
    HOST = ''              # Endereco IP do Servidor
    PORT = 5000            # Porta que o Servidor esta
    tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    orig = (HOST, PORT)
    tcp.bind(orig)
    tcp.listen(1)
    while True:
        con, cliente = tcp.accept()
        pid = os.fork()
        if pid == 0:
            tcp.close()
            print 'Conectado por', cliente
            while True:
                msg = con.recv(1024)
                if not msg: break
                t=time.asctime(time.localtime())
                print t, msg
            print 'Finalizando conexao do cliente', cliente
            con.close()
            sys.exit(0)
        else:
            con.close()


    agradecia imenso alguma ajuda....

  7. #7

    Padrão

    Ixi cara... 24hrs de hoje?! Foi mal... fiquei sem acesso a internet... se ainda tiver em tempo faz o seguinte:

    No progrma do servidor tira aquele else e o con.close(). Desse jeito a parte principal do server vai permanecer com os sockets conectados.

    Depois, antes do while cria uma lista vazia:
    lista_socks = []

    Antes do fork da um append do novo sock na lista...
    lista_socks.append([con, cliente])

    Quando quiser mandar a mensagem para todos os clientes faz o seguinte:

    Código :
    for sock in lista_socks:
        sock[0].send("olá cliente "+sock[1])

    Ainda ta meio POG mas como vc disse que é urgente!!!

    Qualquer dúvida posta ai...

  8. #8

    Padrão

    ja enviei ao professor, não fokou a funcionar essa parte... mas o programa fikou a gerir logins nu inicio etc, assim impossiblita a existencia de 2 usuarios com o mesmo username. mto obrigado pela ajuda. Muito obrigado mesmo.