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

    [C#] Applicazione server ,socket non bloccante

    Ciao a tutti,
    Sto realizzando un'applicazione a console di un piccolo server che accetta connessioni tramite socket,fin qui tutto bene dialoga con i client come previsto.
    Vorrei inoltre dotare questo server di comandi base come Start Stop etc...il problema si presenta qui....il programma mi rimane in ascolto di eventuali richieste di connessione e non mi da al possibilità di scrivere da tastiera alcunchè nella console.
    Avevo pensato di creare 2 thread uno che si occupa di rimanere in ascolto delle connessioni ed un altro che mi gestisce l'imput da tastiera,ma ottengo lo stesso risultato mi si blocca in attesa di connessioni.

    Come faccio a fare un socket non bloccante?Sto seguendo la strada giusta utilizzando i thread?

    questo è il codice che crea i due thread:

    codice:
                    Thread Tcomandi = new Thread(new ThreadStart(LeggiComando));
                    Tcomandi.Start();
                    Thread Tconnessioni = new Thread(new ThreadStart(ascoltoConnessioni));
                    Tconnessioni.Start();
    nel metodo ascoltoConnessioni c'è il codice che si preoccupa di stabilire una connessione tramite il socket.



    Codice per intercettare i comandi
    codice:
            public void LeggiComando(){
                Console.WriteLine("inserisci un comando : ");
                string comando = Console.ReadLine();
                if (comando != "")
                {
                    eseguiComando(comando);
                }
                Thread.Sleep(500);
            }

    codice per la gestione del socket
    codice:
            private void ascoltoConnessioni()
            {
                Thread.Sleep(500);
                //TcpListener is listening on the given port...							{
                TcpListener tcpListener = new TcpListener(porta);
                tcpListener.Start();
                Console.WriteLine("Server Started");
                //Accepts a new connection...
                Socket socketForClient = tcpListener.AcceptSocket();
                
                try
                {
                    if (socketForClient.Connected)
                    {
    
                            Console.WriteLine("Client connected");
                            NetworkStream networkStream = new NetworkStream(socketForClient);
                            StreamReader streamReader = new StreamReader(networkStream);
                            string line = streamReader.ReadLine();
                            Console.WriteLine("Ping from: " + line);
    
                    }
                    socketForClient.Close();
                    Console.WriteLine("Exiting...");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
    
            }
    mic

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    Spiega meglio il "si blocca in attesa di connessioni"

    che output da la console?

    Ti chiede di inserire comandi?

    Controlla il fatto che la console viene scritta da entrambi i thread.. ciò comporta che probabilmente se il thread connessioni utilizza la console magari la rende inaccessibile all'altro thread..

    In generale, quando più thread condividono una risorsa ( console, oggetti ecc...) è buona norma fare un metodo delegato, chiamato poi con invoke, in modo che non si verifichino operazioni crossthread o blocchi dell'applicazione..

  3. #3
    Si blocca nel senso che nella console appaiono in sequenza :

    1) Inserisci un comando
    2) Server started
    3) cursore lampeggiante dove mi fa inserire il comando

    codice:
                Console.WriteLine("Server Started");
    
    qui rimane in attesa ----->   Socket socketForClient = tcpListener.AcceptSocket();
    Il comando pero' me lo fa inserire solo una volta



    Controlla il fatto che la console viene scritta da entrambi i thread.. ciò comporta che probabilmente se il thread connessioni utilizza la console magari la rende inaccessibile all'altro thread..

    In generale, quando più thread condividono una risorsa ( console, oggetti ecc...) è buona norma fare un metodo delegato, chiamato poi con invoke, in modo che non si verifichino operazioni crossthread o blocchi dell'applicazione..

    in effetti entrambi i metodi scrivono su console dei messaggi...



    è buona norma fare un metodo delegato, chiamato poi con invoke, in modo che non si verifichino operazioni crossthread o blocchi dell'applicazione..
    hai tempo di farmi un piccolo esempio!?
    mic

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    ok:


    codice:
    public delegate void delegateMethod(.. variabili del metodo ..);
    
    public delegateMethod var;
    
    
    //nel main
    var= new delegateMethod(metodo);
    
    //il metodo che deve eseguire (es: scrivere su console)
    public void metodo(.. variabili del metodo ..){.........}
    
    
    //nei thread
    invoke(var, new object[]{.. variabili da passare al metodo  ..});

  5. #5
    In realtà la mia applicazione non si ferma dove indicato (ero giunto a conclusioni affrettate...) semplicemente i 2 thread richiamano i metodi a cui sono collegati e poi non ripartono più.

    Come posso tenerli sempre attivi anche dopo che i metodi richiamati hanno finito il loro compito?
    Insomma dovrebbero richiamare ciclicamente i metodi a cui fanno riferimento...!
    mic

  6. #6
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    while(true)
    {
    ..codice del thread
    }

    questo li fa loopare all'infinito..

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 © 2025 vBulletin Solutions, Inc. All rights reserved.