Python servidor e cliente

Started by Dkid, 28 de February , 2006, 06:15:54 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dkid

Oi pessoal, n apareco a algum tempo  :-[ mas vou tentar aparecer mais!
Por agora deixo aki um "programinha" pra voces em python

Com estas duas Apps criamos um servidor que aceita comunicações (servMod.py), e um cliente que as recebe (cliMod.py)

ServMod.py
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while 1:
print "esperando ligacao"
tcpCliSock, addr = tcpSerSock.accept()
print "ligado a: ", addr
while 1:
data = tcpCliSock.recv(BUFSIZ)
if not data: break
tcpCliSock.send("recebendo... > " +
data)
tcpCliSock.close()
tcpSerSock.close()


cliMod.py
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while 1:
data = raw_input('>')
if not data: break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZ)
if not data: break
print "ligado a ", ADDR, " - dados - ",
data
tcpCliSock.close()

Dêm asas à vossa imaginação para o usar  :)

fonte : revista portugal a programar

Kratos

Otimo Dkid...

Pra quem quiser monitorar as chamas de socket:


# -*- coding: UTF-8 -*-

import select
import socket
import itertools

# Algumas constantes usadas

INPUT_READ = 0
INPUT_WRITE = 1
INPUT_EXCEPTION = 2

_read  = {}
_write = {}
_error = {}

_modes = [_read, _write, _error]
_select = select.select

_tags = itertools.count()

class _Wrapper(object):
    # Classe wrapper para os sockets ou arquivos usados

    def __init__(self, source, callback):
        self.source = source
        self.fileno = source.fileno
        self.close = source.close
        self.callback = callback


class TkSelectMixIn:
    # Classe wrapper para select.select().

    def input_add(self, source, mode, callback):
        # Insere um objeto na pilha e retorna um identificador
        #
        # source é o objeto, normalmente um socket
        #
        # mode é uma das constantes INPUT_READ, INPUT_WRITE ou
        # INPUT_EXCEPTION
        #
        # callback é o método a ser chamado quando a condição
        # monitorada for satisfeita

        if mode not in (0, 1, 2):
            raise ValueError("modo inválido")

        tag = _tags.next()
        _modes[mode][tag] = _Wrapper(source, callback)

        return tag

    def input_remove(self, tag):
        # Remove um objeto da pilha. key é o identificador retornado
        # quando o objeto foi inserido
        # Note que o socket NÃO É FECHADO, apenas removido

        for mode in _modes:
            if tag in mode:
                mode.pop(tag)
                break

    def _check(self):
        # Verifica todos os sockets sendo usados e remove quaisquer
        # que estejam com problemas

        for mode in _modes:
            for tag, source in mode.iteritems():
                try:
                    _select([source], [source], [source], 0)
                except: # encontramos o vilão
                    mode.remove(tag)
                    source.close()

    def _select(self,
              # Essa declaração estranha tem uma finalidade. Armazenar
              # as globais no namespace local, acelerando a consulta
              # de nomes, permitindo que este método seja executado o
              # mais rápido possível.
              _read=_read,
              _write=_write,
              _error=_error,
              _select=_select):


        while 1:

            # tentamos o select até não ocorrer erros
            try:
                ready = _select(_read.values(), _write.values(),
                                _error.values(), 0)
                break
            except ValueError:
                # Um socket inválido foi passado...
                self._check()
            except TypeError:
                # Algo que não era um socket foi passado...
                self._check()
            except socket.error, reason:
                # Algum dos sockets está com problemas...
                code, msg = reason.args
                if code == EINTR:
                    # consulte man 2 select
                    return
                if code == EBADF:
                    # Socket com problemas...
                    self._check()
                else:
                    # Se chegamos aqui, realmente não sei o que ocorreu
                    raise

        for condition, mode in enumerate(ready):
            for source in mode:
                source.callback(source.source, condition)

        self.after(100, self._select)


    def start(self):
        self.after(100, self._select)



if __name__ == '__main__':

    import Tkinter
    from ScrolledText import ScrolledText
    from Tkconstants import *

    class MainWindow(Tkinter.Tk, TkSelectMixIn):
        def __init__(self):
            Tkinter.Tk.__init__(self)

            self.textbox = ScrolledText(self, bg='white')
            self.textbox.pack(fill=BOTH, expand=1)
            self.server()
            self.start()

        def server(self):
            # inicializa o servidor

            self.sock = socket.socket(socket.AF_INET, \
                                      socket.SOCK_STREAM)
            self.sock.bind(('localhost', 8000))
            self.sock.listen(1)

            # a chamada para input_read para o socket do servidor é
            # um pouco diferente, tendo como callback o método
            # self.accept
            self.server_tag = self.input_add(self.sock, \
                                             INPUT_READ, self.accept)
            # mantemos uma lista dos clientes conectados
            self.clients = {}

        def accept(self, source, condition):
            # método chamado quando o servidor tem um cliente
            # esperando para ser aceito

            conn, addr = source.accept()
            self.insert("%s:%s conectado\n" % addr)

            # insere o cliente na lista e registra o método self.write
            # como callback para quando existirem dados esperando para
            # serem lidos.

            self.clients[addr] = (conn, self.input_add(conn,
                                               INPUT_READ, self.write))
        def write(self, source, condition):
            # método chamado quando um cliente envia dados

            data = source.recv(1024)
            if not data.strip() or data.strip() == 'bye':
                # se o cliente enviar um "bye" ou uma linha em branco,
                # desconecte-o
                source.close()

                for addr, (conn, tag) in self.clients.iteritems():
                    if source is conn:
                        self.input_remove(tag)
                        self.insert('%s:%s desconectado\n' % addr)
                        del self.clients[addr]
                        break
            else:
                for (addr, port), (conn, tag) in \
                   self.clients.iteritems():
                    if source is conn:
                        self.insert('%s:%s>>>%s\n'%(addr, port, \
                                    data.strip()))
                        break

        def insert(self, data):
            self.textbox.insert(END, data)
            self.textbox.see(END)

        def quit(self):
            self.input_remove(self.server_tag)
            for add, (conn, tag) in self.clients.iteritems():
                self.input_remove(tag)
                conn.close()
            self.sock.close()
            Tkinter.Tk.destroy(self)

if __name__ == "__main__":
    root = MainWindow()
    Tkinter.mainloop()


Fonte: www.pythonbrasil.com.br


Logo postarei metodos da Interface Tkinter!!!!!
::: "A vida é bela pra quem sabe curtir" :::





Dkid

Desculpa a demora em comentar, mas não esqueci !
Esse codigo parece mais funcional, gostei, devia continuar a postar mais Kratos...
Fika bem