Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [JAVA] Bloccare l'accesso ad un file

    sto facendo un programma che usa dei file di testo per salvare/leggere delle informazioni: il problema è che devo usare il multithreading visto che devo fare più cose contemporaneamente.
    (in realtà è un server che crea dei thread, ma fa lo stesso)

    Un thread deve aprire un file modificarlo e richiuderlo.

    Un altro thread deve invece leggere e basta dal quello stesso file e poi aggiornare una lista su una GUI.

    Come posso fare in modo che non si sovrappongono le due cose? Cioè quando uno dei due accede al file, l'altro deve stare fermo.


    Grazie

  2. #2

  3. #3
    ora gli do un'occhiata, grazie

  4. #4
    boh non so se riesco a farlo, forse la mia è una situazione diversa....

    ho a che fare con un server multithreading che riceve chiamate da diversi client contemporaneamente e questi client possono dire al server di fare operazioni diverse.


    a me capita che un client dice al server di modificare il file pippo.txt aggiungendo nuove informazioni; prima che finisca di fare la modifica al file un'altra richiesta gli chiede di inviargli i contenuti di pippo.txt.

    quindi prima che finisca di modificare pippo.txt invia all'altro client pippo.txt che purtroppo è quello "vecchio" e non quello aggiornato.

    non so se mi sono spiegato bene...
    :master: :master: :master: :master:



    grazie in anticipo

  5. #5
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    Quando un client dice al server di modificare il file pippo.txt e il server accetta il comando, deve mettere un lock sul file in modo che, ad una qualunque successiva richiesta da parte di un client di aprire il file mentre questo sta venendo modificato, gli dica "no, non te lo faccio vedere", oppure glielo mandi appena l'operazione di "modifica" e' terminata. Questo mi sembra che ti sia molto chiaro.
    Potresti provare, ad esempio, a introdurre una variabile statica (booleana) chiamata "fileLock" in una classe a tua scelta. Oppure, se hai bisogno di gestire piu' files, potrebbe essere una buona quella di avere una mappa con nomefile come chiave e true/false come valore per indicare la possibilita' ai client di accedere o meno al file.
    Quando il server riceve dal client la richiesta di modificare un file, prima di tutto controlli che il file non sia GIA' bloccato facendo un semplice check sul booleano che ne determina la disponibilita'. Se il file e' "disponibile per la modifica" aggiorni la tua variabile (o il tuo valore all'interno della mappa) a true. Quando la modifica e' finita, torni a valorizzare il tuo booleano o il tuo valore della mappa a false.
    Ovviamente devi aggiungere un semplicissimo controllo anche nel momento in cui un client chieda di aprire il file in questione x visualizzarne il contenuto. Mi sembra chiaro che se il tuo booleano che indica che il lock e' presente e' true, rispondi al client come preferisci ("no!" oppure "aspetta", ecc.). Se invece il lock non c'e', gli fai tranquillamente leggere il file e visualizzare...
    Mi sembra scorrere tutto molto liscio, senza farsi menate su sincronizzazioni varie e altre cose assurde
    Spero di esserti stato in qualche modo di aiuto, non sono nelle condizioni psicofisiche migliori e non ho riletto il post :P

  6. #6
    grazie anzitutto per la risposta.

    ti posto brevemente il codice del server multithreading mettendo solo l'essenziale

    codice:
    import java.io.*;
    import java.net.*;
    
    public class MagServer extends Thread
    {
    
        private Socket client;
    
        public MagServer(Socket client) {
            this.client=client;
        }
        
        public static void main(String [] args)
        {
            try {
            ServerSocket server= startServer(Integer.parseInt(args[0]));
            
            while (true)
            {
                
                Socket client=server.accept();
                System.out.println("Connessione stabilita con un nuovo client");
                MagServer serverT=new MagServer(client);
                serverT.start();
                
            
            }
    }catch (IOException e){}
        }
        
       private static ServerSocket startServer(int port) throws IOException
       {
            ServerSocket server=new ServerSocket(port);
            System.out.println("Sto in ascolto sulla "+port);
            return server;
    
       }
        
        public synchronized void run()
        {
            try{
    
            DataInputStream dataIn=new DataInputStream(new  BufferedInputStream(client.getInputStream()));
            DataOutputStream dataOut=new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
            
            dataOut.writeUTF("Sei collegato. Attendo istruzioni");dataOut.flush();
            String comando=dataIn.readUTF();
            System.out.println("COMANDO AL SERVER: "+comando);
            
    
            if (comando.equals("A"))
            {
    //qui c'è il codice di lettura del file pippo.txt e poi invierà il contenuto al client
            }
            
            
            if (comando.equals("M"))
            {
    //qui invece modifica il file pippo.txt
            }
            
            
            
            
            client.close();
    
            }catch(IOException e){}
    
        }
        
    }

    quindi il while quello nella main fa partire più thread in base alle richieste.

    1) la variabile lock dove la posso dichiarare?

    2) se il file dovesse essere occupato, chi ci prova ad accedere e trova "chiuso" come si comporta? while (fileoccupato==true){}

    3) i file da bloccare purtroppo hanno dei nomi variabili, visto che nel programma è l'utente a sceglierlo. come posso costruire la mappa? (ulteriore file di testo?)

    grazie ancora

  7. #7
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    1)
    codice:
    public class MagServer extends Thread
    {
    
        public static Map fileLock = new HashMap();
    
        private Socket client;
    ...
    2)
    codice:
    if (comando.equals("A"))
            {
        String nomeFile = ....; //il client deve dirti quale file vuole andare a vedere
        if(MagServer.fileLock.get(nomeFile) {
            //implementa il comportamento dell'applicazione
            //se il file e' bloccato (ad esempio, rispondi con un errore)
        } else {
        //qui c'è il codice di lettura del file pippo.txt e poi invierà il contenuto al client
    
            }
    Stessa identica cosa per quanto riguarda la parte di modifica dei file.

    3) A te serve avere l'elenco dei possibili files che il client puo' richiedere di modificare/visualizzare per riempire la mappa fileLock all'inizio (con entries <String nomefile, Boolean true/false>). Magari, piuttosto che creare un file di testo che puo' essere scomodo o difficilmente mantenibile, puoi ricavare l'elenco dei files direttamente "guardando" nel file system e tirando fuori l'elenco dei files presenti in una determinata cartella (e/o che hanno un certo nome, e/o che hanno una certa estensione, ecc. ecc.).
    Volendo puoi pensare anche ad un sistema di refresh della mappa in modo che si accorga di eventuali files che vengono aggiunti o rimossi dal sistema (anche da processi esterni alla tua applicazione).

  8. #8
    1) ma come funziona questo Map??

    2) se faccio così:
    codice:
    if (comando.equals("A"))
            {
        String nomeFile = ....; //il client deve dirti quale file vuole andare a vedere
        while(MagServer.fileLock.get(nomeFile))
        {}//loop finchè non diventa false questo sopra
        //qui c'è il codice di lettura del file pippo.txt e poi invierà il contenuto al client
    
            }
    potrebbe funzionare??
    cioè non stampo alcun errore, aspetto semplicemente che si libera e procedo

    3) purtroppo il programma prevede l'aggiunta di file sempre nuovi e l'eventuale eliminazione di altri. Quindi dovrei fare un refresh ogni volta prima di agire sui file, giusto?



    GRAZIE ANCORA

  9. #9
    Utente di HTML.it L'avatar di nether
    Registrato dal
    Dec 2006
    Messaggi
    376
    1) una collection di tipo "map" non e' altro che un array associativo che, appunto, associa due oggetti tra loro: una chiave e il suo valore corrispondente.
    http://java.sun.com/j2se/1.5.0/docs/.../util/Map.html

    2) la soluzione che hai proposto puo' funzionare ma io piuttosto che fare check continui sul lock farei magari
    codice:
    if (comando.equals("A"))
            {
        String nomeFile = ....; //il client deve dirti quale file vuole andare a vedere
        while(MagServer.fileLock.get(nomeFile))
        {
            Thread.sleep(1000);
        }//loop finchè non diventa false questo sopra
        //qui c'è il codice di lettura del file pippo.txt e poi invierà il contenuto al client
    
            }
    in modo che il controllo sul lock venga fatto solo ogni secondo (o mezzo secondo, o quanto vuoi tu..)

    3) non conoscendo a fondo il funzionamento dell'applicazione non saprei consigliarti sul momento migliore per farlo... Quella che proponi mi sembra cmq un'idea che potrebbe funzionare

  10. #10
    1) OK ho capito, credo sia la soluzione migliore

    2) OK grazie del consiglio

    3) Potrei mettere del codice in modo tale da scrivere nella mappa quando vengono creati nuovi file. Se il file viene poi eliminato me ne frego di pulire la mappa....(anche perchè risulterebbe complicato visto che un file puo' essere eliminato anche se vengono cancellati i dati all'interno e non solo quando viene eliminato il file direttamente)



    dovrei partecipare ai giochi quelli dove si deve scrivere codice offuscato, avrei qualche opportunità di vincere....se ti faccio vedere il codice ti metti paura



    GRAZIE PER LE RISPOSTE, ti faccio sapere come va

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.