Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119

    [JAVA] Problema con socket tcp e stream di I/O

    Ciao ho un problema con un piccolo programma che riassumo brevemente. Un server (E' un thread) rimane in ascolto (Ininterrottamente) su un server socket tcp. Ad ogni connessione in entrata legge il messaggio in input da parte del client, registra l'oggetto di tipo Received in una coda condivisa, invia un "ack" mediante un PrintWriter all'utente (Inutile ma mi serve farlo...) e torna ad attendere la connessione successiva (accept()).
    (Un oggetto Received e' un record composto dal messaggio vero e proprio e dall'oggetto PrintWriter attraverso il quale poter rispondere al client).
    Concorrentemente un altro thread si occupa di leggere tutti i messaggi inseriti nella coda, di controllarne il contenuto e di rispondere opportunamente al client (Utilizzando l'oggetto di tipo PrintWriter).

    Cio' che accade e' che gli utenti riescono ad inviare correttamente i loro messaggi, a ricevere l'"ack" ma, nel momento in cui devono ricevere la risposta (Facendo una readLine), ottengono un null (Come se il socket fosse stato chiuso).

    Penso che il problema derivi dal fatto che il primo handler (Che e' costituito da un ciclo while(true)) quando passa a trattare la connessione successiva chiude quella precedente e percio' anche il writer registrato nell'oggetto di tipo Received "perde validita'".
    Pero' non ne sono sicuro. Anche perche' il thread che si occupa di inviare le risposte riesce ad utilizzare correttamente il PrintWriter senza lanciare eccezioni.

    Spero di essermi fatto capire... :rollo:

    thks

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    e perche gli fai chiudere la connessione al primo thread?

    Sun Certified Java Programmer

    EUCIP Core Level Certified

    European Certification of Informatics Professionals

  3. #3
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da anx721
    e perche gli fai chiudere la connessione al primo thread?
    Il primo thread esegue un ciclo while(true) di questo tipo:

    codice:
    while (true)
            {
                try
                { 
                    //Non setto nessun timeout perche' il mio compito e' soltanto quello di attendere connessioni in entrata
                    incoming = ss.accept();//Chiamata bloccante
                }
                catch(IOException e)
                {
                    System.out.println("Taxi Reservation Handler " + tm.getTaxiName() + "> errore durante la ricezione di prenotazioni sul server socket.");
                    continue;//Passo alla prenotazione successiva
                }
                ....
                ....
                //Qui utilizzo gli stream di I/O ottenuti dal socket
                //Creo un oggetto Received formato dalla stringa ricevuta
                //e dallo stream di output (Un PrintWriter)
           }
    Il socket non lo chiudo esplicitamente e nemmeno il PrinWriter. Pero' quando torno a fare la accept() per attendere lo stabilirsi di una nuova connessione temo che il socket (E di conseguenza gli stream di i/o) venga chiuso "automaticamente".

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Potresti postare un po' più di codice o mettere a disposizione per il download il codice completo? In questo modo sarebbe più semplice provare l'applicazione o quantomeno tentare di capire qual è il passaggio che fallisce.

    In applicazioni di tipo client/server ci sono una infinità di motivi per cui la connessione viene perduta.
    A me verrebbe in mente una situazione del genere (potrebbe non essere il problema):

    1) Fai una accept e ricevi una Socket sulla variabile client
    2) Elabori la richiesta (creando il PrintWriter e tutto quel che ci va dietro)
    3) Torni in attesa di una seconda connessione.
    4) A questo punto l'istruzione accept sostituisce la soket precedente e la connessione viene perduta.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da LeleFT
    Potresti postare un po' più di codice o mettere a disposizione per il download il codice completo? In questo modo sarebbe più semplice provare l'applicazione o quantomeno tentare di capire qual è il passaggio che fallisce.

    In applicazioni di tipo client/server ci sono una infinità di motivi per cui la connessione viene perduta.
    A me verrebbe in mente una situazione del genere (potrebbe non essere il problema):

    1) Fai una accept e ricevi una Socket sulla variabile client
    2) Elabori la richiesta (creando il PrintWriter e tutto quel che ci va dietro)
    3) Torni in attesa di una seconda connessione.
    4) A questo punto l'istruzione accept sostituisce la soket precedente e la connessione viene perduta.


    Ciao.
    E' quel che pensavo anch'io ma la variabile socket e' una variabile locale e percio' penso ne venga creata una nuova ad ogni passata del ciclo while(true) (scope). Infatti se faccio qualcosa di questo tipo:

    codice:
    while (true)
    {
       try
       { 
       //Non setto nessun timeout perche' il mio compito e' soltanto quello di attendere connessioni in entrata
        incoming = ss.accept();//Chiamata bloccante
        }
        catch(IOException e)
        {
         System.out.println("Taxi Reservation Handler " + tm.getTaxiName() + "> errore durante la ricezione di prenotazioni sul server socket.");
         continue;//Passo alla prenotazione successiva
        }
        ResThread rt = new ResThread(incoming);
        rt.start();
    }
    tutto va secondo le previsioni ovvero ogni ResThread riesce ad utilizzare correttamente il socket di competenza. Il problema si crea quando sia il server (Quello che fa l'accept) che i singoli thread utilizzano degli stream di I/O dallo stesso socket.
    Ad esempio se il server, prima di passare il socket al ResThread, avesse inviato una risposta al client tramite un OutputStream, nel momento in cui il thread avesse tentato di utilizzare a sua volta un output stream dello stesso socket si sarebbe verificato un errore.
    Il problema potrebbe essere che avrei dovuto prima chiudere il PrintWriter creato dal server e quindi passare il socket al thread ??

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.