source_chat_python

Vi posto ora il source (codice) per una applicazione base, client/server, è stata implementata una chat.
Il programma funziona da linea di comando e non è presente alcuna interfaccia grafica. Lo ritengo un buon punto di partenza per sviluppare applicazioni più complesse basate sui socket, un ramo della programmazione che ritengo essenziale e molto interessante.

Salvare i file con estesione .py ed eseguire nel terminale prima il server e poi il corrispettivo client.

SERVER:

[snippet=6134]

CLIENT:

[snippet=6133]

Ringrazio il forum di python-it.org per il supporto che mi stà fornendo.

If you enjoyed this post, make sure you subscribe to my RSS feed!
Share

Comments

  1. 1
    lumo // July 8th, 2008 at 22:57

    ciao, molto insteressante questa storia dei socket per python, anche se trovo che sia meglio imparare il php o il perl per questo genere di cose…
    posso pertmettrmi di dare una piccola spiegazione al programma?

    SERVER

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

    per AF_INET si indicana il protocollo TCP/IP con indirizzo ip IPv4; SOCK_STREAM indica il tipo di scocket.

    conn, addr = s.accept()

    accetto la connessione con il client

    s.bind((HOST, PORT))

    uso un host e una porta da me specificati per connettermi(?) ( comunque l’incontrario di s.connect())

    s.listen(6)

    decido il numero massimo di connessioni (6)

    data = conn.recv(1024)

    la variabile data contiene i dati ricevuti e non potra superare il peso di 1024 byte

    if text==’/quit’:
    print ‘BYE’
    s.close()

    ovvio…

    if not data: break

    sarebbe uguale a else: break

    print ‘Client’,addr,’::. \t’+data

    stampo a video i dati inviati dal client

    risp=raw_input(Server::. \t’)
    conn.send(risp)

    rispondo al client

    CLIENT
    s.connect((HOST, PORT))

    mi connetto al server

    text=raw_input(‘Client::. \t’)

    questo sarà il testo da mandare al server (che non puo superare i 1204 byte)

    if text==’/quit’:
    print ‘BYE’
    s.close()

    ovvio

    else:
    s.send(text)

    mando il testo al server

    data = s.recv(1024)

    ricevo la risposta dal server( risp=raw_input(‘Server::. \t’)
    conn.send(risp)
    )

    risp()

    con la ricosione faccio ripartire la funzione

    per capire meglio i socket si puo fare un semplice portscanner…

    from socket import *

    while1:

    host=raw_input(“inserisci l’host…\n”)
    porta=(input(“inserisci la porta…\n”))

    try:
    s=socket.connect((host,porta))
    print “porta”,porta,”aperta”
    except:
    print “porta”,porta,”chiusa”

  2. 2
    cirio // July 8th, 2008 at 23:43

    @lumo: ciao, bhè il python ha molte librerie che facilitano la comunicazione tra client e server, dai un occhiata alle lib. twisted;) le stò studiando ora e sono fatte davvero bene.
    Magari domani racchiudo,leggendola, la “spiegazione” in un txt per non sfalsare troppo il post.
    Grazie del contributo.

  3. 3
    silvio // July 29th, 2008 at 18:52

    ciao ottimo lavoro!
    volevo sapere se c’era il modo di farlo passare tramite 2 router (tramite internet).
    Senza dover usare una vpn. mi sarebbe molto utile potermi fare una chat internet!!

  4. 4
    cirio // July 29th, 2008 at 19:47

    @silvio: si certo, dovresti effettuare una connessione udp oltre che aprire le porte del router; se non hai ben chiaro il concetto ti spedito all’email indicata nel commento un esempio.

  5. 5
    silvio // July 29th, 2008 at 20:01

    io mi sono già fatto un server e un client in udp ma funzionano solo in locale o al massimo con hamachi .. quello che non ho capito è come specificare l’ip e se specifico l’ip del router (perchè e lui che mi manda su internet) come faccio a non dover aprire le porte sul router?io voglio fare un’applicazione tipo msn…non voglio che per usarla ci si complichi la vita!si può?
    grazie per il tuo aiuto!!

  6. 6
    cirio // July 29th, 2008 at 21:31

    @silvio: no no asp, in che senso!? le porte sul router le devi aprire, se no non riesci a comunicare; e poi l’ip non deve essere quello del gateway eh.. ma bensì della macchina x con cui vuoi dialogare; per costruire app. come msn credimi bisogna avere un background abbastanza consistente in quanto sono software complessi.
    Per facilitarti la vita in app. di network con python puoi dare uno sguardo a asyncore, asynchat, SocketServer (nella libreria standard) e Twisted.

  7. 7
    silvio // July 29th, 2008 at 22:05

    ma supponiamo che io apra le porte del router (o che usi un modem usb) l’ip che devo usare è quello che vedo scritto ad esepio su http://www.showmyip.com/ giusto? solo che se io ho un router quello è l’indirizzo del router!? allora come faccio? grazie mille per i chiarimenti…

  8. 8
    cirio // July 30th, 2008 at 00:07

    @silvio: si è quello che trovi con quel sito;
    l’indirizzo del router, cioè il default gateway, lo trovi semplicemente così–> macchine windows(da linea di comando): route PRINT
    macchine unix/linux: route
    e sarà del tipo(parlo per un netgear) 192.168.0.1 ad esempio.. e non c’entra con la costruzione dello script; il default gateway interviene quando un host richiede il collegamento ad un indirizzo ip esterno alla rete locale, è utile ad esempio per l’instradamento dei pacchetti..
    Io terrei in considerazioni le opportunità che ti ho citato prima;)

  9. 9
    silvio // July 30th, 2008 at 13:02

    scusa mi sono spiegato male: intendevo dire che se ho ad esempio 2 pc dopo il router come faccio a scegliere quale dei due deve ricevere il pacchetto inviato? l’ip pubblico viene assegnato al mio router!! non a uno dei miei 2 pc. quindi se io apro una porta sul router e gli dico di aprirla a quel pc e poi nel programma imposto quella porta dovrebbe funzionare giusto?! ma potrei ad esempio usare una porta che di solito è sempre instradata ,la porta 80 o la 8080? così non mi tocca reimpostare tutti i router!!!??giusto?

  10. 10
    cirio // July 30th, 2008 at 13:22

    @silvio: no, non puoi utilizzare porte già occupate, usa porte alte(di n°).
    Quando apri la porta sul router, esso ti dice di assegnare anche l’ip del server della lan, per cui non si presentano problemi in quanto, ad esempio:
    192.168.0.1 –> gateway default
    192.168.0.2 –> pc fisso
    192.168.0.3 –> portatile -laptop-
    escono tutti e 3 su internet con ip uguale, la gli ip della lan cambiano; solo l’unico problema che ti si potrebbe presentare è se hai il dhcp attivo, e cioè che l’ip della lan viene assegnato in automatico, per cui non potrai prevedere quale sarà.

  11. 11
    silvio // July 30th, 2008 at 13:34

    peccato che non possa usare la porta 80 …
    grazie per i chiarimenti !!! ciao

  12. 12
    cirio // July 30th, 2008 at 13:40

    di niente;) p.s ti consiglio di imparare ad usare ssh, se non lo sai già fare, con una delle sue tante funzionalità avresti fatto in un lampo a fare il portforwarding su tt i pc^^

  13. 13
    silvio // July 30th, 2008 at 13:47

    purtroppo non ne so propio niente di ssh ….bene grazie per la dritta vorra dire che me lo studierò…

  14. 14
    michele // January 10th, 2012 at 17:26

    per cirio89, è una persona prestante e gentile – grazie

Lascia un commento

You must be logged in to post a comment.