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

    [Applicazione multithread] Problemi gestione delle comunicazioni

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    fondamentalmente sbagli ad applicare concetti di base e le parole chiave:

    1. static, si riferisce ad un attributo/membro di classe, sarà disponibile con lo stesso valore per tutte le istanze di una data classe. In genere è usato per mantenere costanti, in modo da non dover ripeterne il valore per tutte le istanze
    2. final, si riferisce ad un attributo non modificabile, quindi dubito fortemente che se tu hai
    codice:
    static final String nome
    tu lo possa modificare.
    Rivedi le basi e se vuoi fare una applicazione client/server che tenga le identità degli utenti, pensa bene di tenerle dentro una MAPPA a cui tutti possono accedere in modo sincronizzato
    RTFM Read That F*** Manual!!!

  3. #3
    Grazie mille valia, mi hai datto delle dritte fondamentali!
    Il problema è che dichiarando Static tutti gli attributi globali della classe, le modifiche che avvenivano sugli attributi si riflettevano anche su gli attributi delle altre istanze della classe!!
    Per ora ho risolto NON dichiarando static le variabili che devono essere specifiche per le entità così un eventuale modifica non si riflette anche su tutte le entità inizializzate..

    Non ho però creato file MAPPA per gestire i client connessi, è un grosso errore? Sapete darmi anche altre indicazioni per migliorare ciò che sto programmando??

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    certo, considera che una mappa è una collection, un qualcosa in grado di mantenere oggetti (un aggregato insomma).
    Te ne ho detta una (la più comune) usata per mantenere dati
    RTFM Read That F*** Manual!!!

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.