Salve a tutti!!!!!![]()
Mi scuso innanzitutto qualora dovessi aver sbagliato a inserire questa discussione qui; è dovuto alla mia poca esperienza col forum a cui spero di abituarmi presto.
Cercherò di esporre dettagliatamente il problema che mi si è posto davanti e che mi sta facendo sbattere la testa da un pò di tempo ormai. Il contesto innanzitutto, anche se non dovrebbe servire a molto. L'applicazione che sto implementando, a scopo didattico, è una Chat Avanzata con funzionalità di messagistica istantanea,creazione gruppi,scambio e/o condivisione file con il supporto del DBMS MySQL. Il funzionamento generale dovrebbe essere(almeno per la versione base) questo: un client si connette al server, comunicando attraverso un protocollo, e fa richiesta,via via, di tutto ciò che gli serve (ex: lista amici, lista gruppi, registrazione di un utente, ricerca di un utente ecc ecc...); il server reinvia le informazioni richieste dal client che ne ha fatto domanda. Un classico modello client-server che attualmente funziona e con cui non ho avuto problemi. Spero di non essere stato lungo nell' introduzione, ma cerco di dare più informazioni possibili. Andiamo al problema vero e proprio. Quando un utente X cerca di contattare un utente Y(invio di una semplice stringa), con cui è "amico" (ed online), il server, che agisce da relay tra i due client, dovrà creare un'autostrada virtuale tra essi; una volta ricevuto il messaggio da X deve inoltrarlo a Y e per far ciò ha bisogno della socket con cui è "connesso" direttamente ad Y. I modi di immagazzinare le socket connesse al server possono essere diverse a seconda delle varie implementazioni. Poichè ne ho provate diverse, e tutte, ahimè, non funzionano ne espongo una per semplicità. Il server prende la socket da un HashTable, in cui ci sono tutti gli utenti attualmente loggati all'applicazione, (con key= Y e value = socket) e inizializza un oggetto ObjectOutputStream( già ampiamente usato per i metodi in cui il server reinvia informazioni richieste da un utente) e lo usa per "inoltrare" il messaggio a Y. Premesso che "catturo" tutte le possibili eccezioni, runtime non avviene nulla, ovvero X scrive il suo messaggio per Y, il server(che riceve il messaggio) fa le operazioni sopra descritte e scrive sull'output stream di Y e l'applicazione continua normalmente. Nessuna eccezione, nessun errore, nessuna notifica nella parte di codice predisposta al "fetching" delle richieste da parte del client(in questo caso di Y); è come se l'oggetto spedito fosse completamente perso e non se ne ha più traccia.
Oltre questa implementazione ne ho provate altre; ma tutte hanno portato allo stesso esito, quello sopra descritto. Per esempio sono riuscito ad evitare di conservare le socket in una struttura dati e tramite una classe da me definita, che ho chiamato "Board", scrivo dentro i messaggi da inviare ai singoli utenti e tramite un thread per singolo utente spedisco tramite il "proprio" outputstream le stringhe da inviare. Il meccanismo dovrebbe essere in poche parole questo: un thread per l'utente A, che gira sul server, e controlla la Board di A (in cui ci sono tutti i messaggi rivolti all'utente A), e se ne trova, li spedisce direttamente. In questo modo non avrebbe bisogno di trovare la socket appartenente ad un utente particolare, dato che è quel thread stesso che si occupa dell' input/output per quell'utente (un pò come avveniva nel meccanismo descritto all'inizio per le richieste che un client faceva al server).
Ovviamente ci saranno diverse e varie e probabilmente migliori implementazioni anche a livello computazionale di questo meccanismo molto semplice. Aldilà dell'efficienza computazionale tutte portano allo stesso esito.
Spero (tantissimo) possiate aiutarmi e riusciate a darmi delucidazioni su questo comportamento anomalo.
Vi ringrazio tutti anticipatamente.
Buona giornata.