Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Socket & python]

    Ciao a tutti. Sto da poco iniziando a pacioccare con le socket. Come esercitazione ho fatto una semplice applicazione composta da un client e da un server. La parte client manda i messaggi al server e quest'ultimo li stampa a video.
    codice:
    ### server
    
    from socket import *
    port = 80
    
    test = socket(AF_INET, SOCK_STREAM)
    test.bind(("127.0.0.1", 80))
    test.listen(5) # definisce il numero max di connessioni simultanee
    print "Ready to receive strings. "
    conn, addr = test.accept() #la funzione accept() mette il socket in listening
    print "Indirizzo socket", conn
    print "Server contattato da", addr
    
    
    while 1:
    	data = conn.recv(1024)
    	print data
    	if data == "exit":
    		break
    	
    test.close()
    print "\nFine."
    Client:

    codice:
    ### client
    
    from socket import *
    
    host = "127.0.0.1"
    port = 80
    addr = host, port
    
    client = socket(AF_INET, SOCK_STREAM)
    client.connect(addr)
    
    print "Ready to send strings. Type 'exit' to quit"
    
    while 1:
    	data = raw_input("Testo: ")
    	client.send(data)
    	if data == "exit":
    		break
    	
    client.close()
    print "\nFine."

    Il codice così com'è funziona correttamente.
    Ora volevo fare in modo che anche il server potesse mandare messaggi al client. Una cosa del tipo:

    test.send(data)

    conn.recv(data)

    ...ma non funziona.
    Per fare questo come posso fare? Devo creare un nuovo oggetto socket?
    Sarebbe alquanto scomdo. Su IRC mi è stato suggerito di utilizzare un thread in parallelo per gestire due processi contemporaneamente ma la cosa non mi appare molto chiara. Qualcuno può illuminarmi a riguardo?
    Saluti.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  2. #2

    Re: [Socket & python]

    Originariamente inviato da billiejoex

    Ora volevo fare in modo che anche il server potesse mandare messaggi al client. Una cosa del tipo:

    test.send(data)

    conn.recv(data)

    ...ma non funziona.
    Per fare questo come posso fare?
    Devi aprire una sock.recv() anche sul client e poi fai la stessa cosa che hai fatto prima; puoi anche processare con un if-elif i messaggi del client in modo che il server risponda di conseguenza, eccetera.

  3. #3
    Ho provato a fare esattamente come hai detto tu ma non funziona. Ogni volta che il server tenta di mandare un messaggio al client esso non viene trovato.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  4. #4
    Ti ho riscritto i programmi al volo:

    codice:
    #!/usr/bin/python
    # the server
    from socket import *
    
    def main():
    
       sock = socket(AF_INET, SOCK_STREAM)
       sock.bind(('127.0.0.1', 6668))
       sock.listen(5)
       while 1:
           conn, addr = sock.accept()
           print 'Si e connesso ', addr
           conn.send('Welcome, client\n')
    
           while 1:
              data = conn.recv(1024)
              print '> '+data    
    
              if data == 'help':
                 print 'help request recived from client'
                 conn.send('needed help? :]');       
      
              
    if __name__ == "__main__":
            main()
    codice:
    #!/usr/bin/python
    # the client
    from socket import *
    
    def main():
    
       sock = socket(AF_INET, SOCK_STREAM)
       try:
            sock.connect(('127.0.0.1', 6668))
       except:
            print '\nFATAL ERROR: Could not make connection'
            print 'No socket listening on default port\n'
    
       while 1:
          data = sock.recv(1024)
          print data
          txt = raw_input('Insert text: ')
          sock.send(txt)
    
    if __name__ == "__main__":
            main()

  5. #5
    Perfetto. Anche qualche piccolo controllo sugli errori non fa mai male.
    A buon rendere.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  6. #6
    Solo una precisazione: forse non ti sei accorto che il codice del server, così come l'ho scritto ieri, si pianta dopo ogni stringa passata dal client... ma correggere l'errore è facile

  7. #7
    Lo chiudo passandogli una stringa 'exit' dal client tramite un costrutto if.
    Effettivamente pero CTRL+C non funziona. Coma mai?
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  8. #8
    Originariamente inviato da billiejoex
    Lo chiudo passandogli una stringa 'exit' dal client tramite un costrutto if.
    Effettivamente pero CTRL+C non funziona. Coma mai?
    Io mi riferivo al fatto che così come l'ho scritto, una volta eseguito il client
    codice:
    [maiosyet@alcibiade tmp]$ ./client.py
    Welcome, client
    
    Insert text: prova1
    ...
    [programma bloccato]
    [Ctrl+C]
    
    Traceback (most recent call last):
      File "./client.py", line 22, in ?
        main()
      File "./client.py", line 15, in main
        data = sock.recv(1024)
    KeyboardInterrupt
    ...e il server va in loop infinito.
    Questo accade perchè, come ci mostra l'output di ctr+c, il programma client sta ora aspettando uno stream di dati che il client in realtà non gli invierà mai... quindi basta aggiungere una cosa tipo:
    codice:
    if data == 'help':
             print 'help request recived from client'
             conn.send('needed help? :]')
    else:
             print 'Invalid request recived'
             conn.send('uh?')  #invia comunque uno stream
    E funziona perfettamente. Sulla mia box Ctrl+C come hai visto funziona perfettamente... in alternativa per killare un programma python puoi provare EOF (Ctrl+D su Unix, su Win non lo so)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.