Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    35

    [JAVA] Creazione dinamica arraylist con server

    Salve a tutti, spiego brevemente il mio problema,
    Ho un server java udp in ascolto il quale riceve delle stringhe contenenti indirizzi ip da un client python. La comunicazione tra i due è perfettamente funzionante.
    Il problema viene in fase di progettazione, in quanto io ho bisogno di registrare gli ip che al momento sono connessi (in altre parole quelli che ricevo dal client) e ciò lo faccio utilizzando gli arraylist con il metodo add. Ho però bisogno di poter cancellare questi ip nel momento in cui non vengono più spediti dal client in quanto significherebbe che questi ip non sono più connessi alla rete.
    Ho capito che potrei usare il metodo remove della classe arraylist ma non saprei proprio come combinarlo per ottenere ciò che voglio! Aiutatemi please, grazie!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Espyos Visualizza il messaggio
    Ho un server java udp in ascolto il quale riceve delle stringhe contenenti indirizzi ip da un client python.
    Il pacchetto contiene una stringa con l'indirizzo IP del mittente?? Ma guarda che ... non serve. Quando ricevi il pacchetto UDP (in Java un DatagramPacket) l'indirizzo del mittente è già disponibile intrinsecamente.

    Quote Originariamente inviata da Espyos Visualizza il messaggio
    in quanto io ho bisogno di registrare gli ip che al momento sono connessi
    Parlare di "connessione" su UDP è quanto meno vago/dubbio. Quindi "connessi" in che senso?

    Quote Originariamente inviata da Espyos Visualizza il messaggio
    Ho però bisogno di poter cancellare questi ip nel momento in cui non vengono più spediti dal client in quanto significherebbe che questi ip non sono più connessi alla rete.
    Innanzitutto, visto che si tratta di UDP, se non è il mittente stesso che manda un pacchetto particolare e apposito che indica "guarda che da adesso non ti contatterò più", l'unica è implementare un sistema di timeout. Ovvero dopo tot tempo che non arrivano più messaggi dal mittente X, allora puoi presumere, che non sia più in gioco.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    35
    no, guarda la questione è diversa, non sono entrato io nei particolari, scusa
    ho da un lato una rete di sensori ed ogni 10 secondi sono a conoscenza degli ip di questi sensori collegati alla rete. Io invio questi ip ad un server java, e di conseguenza voglio avere traccia di tutti questi ip. Se nella rete di sensori uno di questi si disconnette il suo ip non verrà più inviato, ergo io ho bisogno di "cancellare" la voce che lo riguarda su lato server java. Come faccio?

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    La soluzione del timeout suggerita da andbin perché non ti piace? Mi sembra proprio quello che ti serve..

    Incapsula l'indirizzo IP in una classe che lo associa al timestamp di ultimo aggiornamento. Ogni volta che ti arriva un indirizzo IP e questo esiste già allora aggiorni il suo timestamp. Ovviamente se un indirizzo non ti arriva più il suo timestamp non verrà più aggiornato e quindi puoi stabilire che, per esempio, se un indirizzo è più vecchio di X secondi allora lo rimuovi.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    35
    Scusate, ho fatto qualche ricerchina, ma non essendo troppo ferrato in java non ho trovato il modo per attuare la vostra. Sia questo il codice:

    codice:
    ArrayList<String> A = new ArrayList<String>();
    		ArrayList<String> B = new ArrayList<String>();
    
    
    		UDPServer server = new UDPServer();
    		Thread t = new Thread(server);
    		t.start();
    		while(t.isAlive()==true){
    			
    			if (A.contains(UDPServer.sentence) == false && UDPServer.sentence != null)
    				{
    					System.out.println("ADDED: \n" + UDPServer.sentence);
    					A.add(UDPServer.sentence);
    				}	
    				System.out.println("Check -------------");
    				for (int i=0; i< A.size() ; i++)
    				{
    					System.out.println(A.get(i));
    				}
    
    
    				try {
    			Thread.sleep(5000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    La classe udp server ovviamente non è da spiegare. Creo un thread ed ogni volta che arriva un indirizzo una stringa viene aggiunta alla lista e finisce qui. Ora come dovrei modificarlo per funzionare come avete consigliato? Grazie!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Espyos Visualizza il messaggio
    La classe udp server ovviamente non è da spiegare.
    Ma è sicuramente molto "dubbia". Quel sentence, per quanto si può intuire dal codice, è sicuramente un campo static. E già qui è un male ...
    Ma non è tutto: UDPServer è sicuramente un Runnable (lo passi al costruttore di Thread). Questo vuol dire che dentro UDPServer "girerà" del codice in un thread differente da quello che esegue il codice che hai postato. E vedendo l'uso diretto di quel campo static, vuol anche dire che, molto probabilmente, non hai nemmeno considerato le questioni relative alla sincronizzazione e "visibilità" delle modifiche tra i thread.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    35
    scusami io non vorrei essere in insistente, ma non sto riuscendo a capire la questione, o meglio cosa dovrei fare.
    Posto anche il codice del server:

    codice:
    class UDPServer implements Runnable {
    
    
        static String sentence;
        public void run(){
        
        DatagramSocket serverSocket = null;
        
            ArrayList<String> A = new ArrayList<String>();
    
    
            try {
                serverSocket = new DatagramSocket(4445);
            } catch (SocketException e) {
                e.printStackTrace();
            }    
            byte[] receiveData = new byte[1024]; 
            while(true)   
            {      
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
                try {
                    serverSocket.receive(receivePacket);
                } catch (IOException e) {
                    e.printStackTrace();
                }    
                sentence = new String(receivePacket.getData());
    So di non aver sistemato troppo bene tutte le variabili ecc. perchè per me basta funzioni, ma nel caso in questione come dovrei modificare?

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2007
    Messaggi
    35
    Up

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.