Ciao a tutti! ho costruito un sistema di comunicazione client-server seguendo gli esempi sul sito Oracle; ho implementato così 3 diverse classi per il lato server:
1- una classe server main che rimane in ascolto su una porta tramite socket; una volta arrivata richiesta dal client viene creato un thread grazie al costruttore della classe multithread
2- ho, quindi, una classe Multithread che ho fatto per poter gestire le richiesta tramite creazione di più thread (così posso quindi connettere più di un client, vero?) che estende la classe Thread;
3- la gestione dei messaggi che arrivano dai client la faccio tramite una classe chiamata Protocol che contiene l'implementazione del metodo processImput. Questa classe ha alcune variabili globali, nello specifico: stati in cui si trova il client rispetto alla comunicazione (nel mio caso degli interi per: login, ... exit dichiarati static e final) e altre informazioni che mi risultano necessarie per l'applicazione dei metodi (come il nome dell'utente inserito per fare il login, o un array con alcuni campi selezionati dall'utente dichiarati solamente static). Questa classe al suo interno anche numerosi metodi dichiarari static che sono necessari per svolgere controlli su i dati inseriti e ottenere/modificare informazioni su file. Ho dichiarato tutti i metodi che leggono e scrivono su file come syncronized per evitare che possano scrivere/leggere contemporaneamente dal file ottenendo dati inconsistenti.

Da come io avevo inteso il materiale e gli esempi che ho reperito in internet pensavo che:
a) la classe server main rimane sempre in ascolto e quando ottiene una richiesta di connessione da un client avvia il multithread
b) la classe multithread implementa e gestisce thread differenti in base ad ogni richiesta proveniente dai differenti client
c) si generava un istanza specifica per ogni thread della classe protocol, con le sue proprie variabili globali inizializzate
d) dichiarando synchronized i metodi che gestiscono la lettura/scrittura su file avrei evitato problemi di lettura/scrittura in contemporanea

... ma credo che alla fine non funzioni così perchè..

Il mio problema è il seguente: quando connetto piu client le azioni di un client che nel protocollo modificano alcune variabili globali si riflettono anche in tutti gli altri client! Per essere più chiaro: quando un utente effettua un login e modifca la variabile globale nome, la variabile globale risulterà essere modificata anche in tutte le variabili nome degli altri client connessi

Io pensavo potesse essere un problema riguardante la dichiarazione delle variabili globali nella classe "protocollo", soprattutto quelle solo static. Per poterlo sviare ho creato una nuova classe chiamata UtenteServer che, nella mia idea, sarebbe servita a gestire e a memorizzare le variabili che prima non risultavano essere final nella classe protocol. Nella modifica una variabile globale UtenteServer veniva dichiarata static & final nella classe protocol e poi, tramite metodi specifici della classe UtenteServer. si era in grado di impostare i valori delle sue variabili!! la modifiche, però, non mi risolvono il problema, la situazione non cambia, modifiche a variabili globali della classe UtenteClient si riflettono anche su tutti gli altri utenti..

Da che cosa nasce il problema? Deriva forse dal fatto che le comunicazioni avvengono tutte sulla medesima porta? Ho sbagliato a sviluppare l'architettura della classe multithreading? è colpa della dichiariazioni delle variabili globali nella classe protocol? è un problema sul client? Mi sapete indicare dov'è sbagliata l'idea che avevo io di come funzionasse (a,b,c,d)?

Vi ringrazio in anticipo con un grazie mille mila per l'attenzione, se volete che posti del codice lo posto anche se mi sembrava di essere stato abbastanza preciso!
GHoldenBoy