Visualizzazione dei risultati da 1 a 8 su 8

Discussione: lista di socket

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    285

    lista di socket

    vorrei tenere traccia dei socket aperti tramite una lista ed inviare a tutti i client , per ogni nuovo client che si connette , un messaggio che avvisa del nuovo utente in linea (messaggio di broadcast) .
    Il codice per fare questo "esperimento" è il seguente.
    codice:
    import java.net.*;
    import java.io.*;
    import java.util.*;
    public class Server {	
     private ServerSocket servSocket;
     private int porta ;//num di porta su cui accetto connessioni
     private boolean running; // mi dice finché devo servire il client 
     private ArrayList<Socket> clients;
      
      Server(int port){//costruttore
    	  this.porta=port;
    	  this.running=false;
    	  this.servSocket=null;
      }
      Server(){
    	  
      }
      //METODI
      public void start(){//mette in ascolto il server
    	  try {
    		servSocket=new ServerSocket(porta);//setto il socket
    		running=true;
    		System.out.println("In ascolto sulla porta "+porta);
    	  } catch (IOException e) {
    	    System.out.println("Impossibile connettersi alla porta "+porta);
    	    }
    	 while(running){
    		 serve();
    	 }
      }
      
      public void stop(){//fermo il servizio
    	  running=false;
      }
      
      public void aggiorna(Socket link){
    	  clients = new ArrayList<Socket>();
    	  clients.add(link);// aggiungo il socket alla lista
    	  int tot = clients.size();
    	  PrintWriter OUT;
    		//invio broadcast
    	  Socket cl;
    	  Iterator<Socket> it = clients.listIterator();
    	  while(it.hasNext()){
    		cl = it.next();
    		try {
    			OUT= new PrintWriter(cl.getOutputStream(),true);
    			OUT.println("Un nuovo client è connesso");
    			OUT.println(tot +"connessi");
    		    } catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		    }
    
    	  }
      }
      
      public void serve(){
      try {
    	Socket canale=servSocket.accept();//accetto 
    	Thread app = new Application(canale);
    	app.run();
      } catch (IOException e) {
    	System.out.println("Impossibile connettersi al client");
    	stop();
        }  
      }
      public static void main(String[] args){
    	  Server serv = new Server(7777);
    	  serv.start();
      }
     
    }
    
    public class Application extends Thread {
      private Socket connessione;
      private PrintWriter OUT ;
      Application(Socket link){
    	 this.connessione=link; 
      }
      public void run(){
       try {
    	 Server serv = new Server();
    	 serv.aggiorna(connessione);
    	 System.out.println("connesso con il client");  
    	 OUT=new PrintWriter(connessione.getOutputStream(),true);
    	 OUT.println("benvenuto");
       }  catch (IOException e) {
    	  e.printStackTrace();
          }
      }
    }
    qualcuno paziente ed esperto potrebbe dirmi cosa c'è che non va ? La lista risulta sempre di dimensione 1

    Ovviamente per la classe Application ho usato un altro file (Application.java)

  2. #2
    codice:
     serv.aggiorna(connessione);
     System.out.println("connesso con il client");  
     OUT=new PrintWriter(connessione.getOutputStream(),true);
     OUT.println("benvenuto");
    penso che queste righe di codice devono trovarsi in un ciclo che controlli usando il campo running, altrimenti il server accoglierà solo 1 richiesta di connessione e non N.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    285
    codice:
    import java.io.IOException;
    import java.net.*;
    import java.util.*;
    public class Server {
     private boolean running;
     private int port;//porta su cui ascoltare
     private ServerSocket serverSocket;
     
     private ArrayList<Socket> clients;
     
      Server(int serverPort){//costruttore
    	  this.port=serverPort;
    	  this.serverSocket=null;
    	  this.running=false;
      }
     
     public void start(){//metodo per l'avvio del server
    	  serverSocket=null;//inizializzo serverSocket
    	 try {//cerco di mettere in ascolto il server
    		serverSocket=new ServerSocket(port);
    		System.out.println("Server in ascolto sulla porta "+port);
    		running=true;//essendo connesso correttamente , il server può girare
    	 } catch (IOException e) {
    	   System.out.println("Impossibile connettersi alla porta "+port);
    	   }
    	 while(running){//finché può girare , gira
    		serve(); 
    	 }
     }
      public void stop(){//metodo per fermare l'esecuzione del server
    	running=false; 
      }
     public void serve(){//con questo metodo accetto le connessioni con i client
    	 Socket client = null;
    	 try {
    		client=serverSocket.accept();//instauro connessione con il client. Ricorda.accept() restituisce un socket
    		clients = new ArrayList<Socket>();
    		clients.add(client);
    		System.out.println("numero di client : "+clients.size());
    		//avvio un thread per ogni connessione accettata
    		Thread applicazione = new Applicazione(client);
    		applicazione.start();//metodo che avvia il thread
    	} catch (IOException e) {
    		System.out.println("Impossibile instaurare connessione con il client");
    		stop();//stoppo il server
    	  }
     }
      public static void main(String[] args){
    	  Server server = new Server(7777);
    	  server.start();
      }
    }
    purtroppo la dimensione della lista è ancora 1

  4. #4
    Ecco l'errore:
    codice:
    clients = new ArrayList<Socket>();
    clients.add(client);
    System.out.println("numero di client : "+clients.size());
    clients devi istanziarlo una sola volta!

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    285
    corretto!
    ecco il codice corretto
    codice:
    import java.io.IOException;
    import java.net.*;
    import java.util.*;
    public class Server {
     private boolean running;
     private int port;//porta su cui ascoltare
     private ServerSocket serverSocket;
     
     private ArrayList<Socket> clients;
     
      Server(int serverPort){//costruttore
    	  this.port=serverPort;
    	  this.serverSocket=null;
    	  this.running=false;
    	  clients=new ArrayList<Socket>();
      }
     
     public void start(){//metodo per l'avvio del server
    	  serverSocket=null;//inizializzo serverSocket
    	 try {//cerco di mettere in ascolto il server
    		serverSocket=new ServerSocket(port);
    		System.out.println("Server in ascolto sulla porta "+port);
    		running=true;//essendo connesso correttamente , il server può girare
    	 } catch (IOException e) {
    	   System.out.println("Impossibile connettersi alla porta "+port);
    	   }
    	 while(running){//finché può girare , gira
    		serve(); 
    	 }
     }
      public void stop(){//metodo per fermare l'esecuzione del server
    	running=false; 
      }
      
      public void lista(Socket cl){
    	  //clients = new ArrayList<Socket>();
    	  clients.add(cl);
      }
      
     public void serve(){//con questo metodo accetto le connessioni con i client
    	 Socket client = null;
    	 try {
    		client=serverSocket.accept();//instauro connessione con il client. Ricorda.accept() restituisce un socket
    		lista(client);
    		
    		System.out.println("client : "+clients.size());
    		//avvio un thread per ogni connessione accettata
    		Thread applicazione = new Applicazione(client);
    		applicazione.start();//metodo che avvia il thread
    	} catch (IOException e) {
    		System.out.println("Impossibile instaurare connessione con il client");
    		stop();//stoppo il server
    	  }
     }
      public static void main(String[] args){
    	  Server server = new Server(7777);
    	  server.start();
      }
    }
    grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    285
    corretto!
    ecco il codice corretto
    codice:
    import java.io.IOException;
    import java.net.*;
    import java.util.*;
    public class Server {
     private boolean running;
     private int port;//porta su cui ascoltare
     private ServerSocket serverSocket;
     
     private ArrayList<Socket> clients;
     
      Server(int serverPort){//costruttore
    	  this.port=serverPort;
    	  this.serverSocket=null;
    	  this.running=false;
    	  clients=new ArrayList<Socket>();
      }
     
     public void start(){//metodo per l'avvio del server
    	  serverSocket=null;//inizializzo serverSocket
    	 try {//cerco di mettere in ascolto il server
    		serverSocket=new ServerSocket(port);
    		System.out.println("Server in ascolto sulla porta "+port);
    		running=true;//essendo connesso correttamente , il server può girare
    	 } catch (IOException e) {
    	   System.out.println("Impossibile connettersi alla porta "+port);
    	   }
    	 while(running){//finché può girare , gira
    		serve(); 
    	 }
     }
      public void stop(){//metodo per fermare l'esecuzione del server
    	running=false; 
      }
      
      public void lista(Socket cl){
    	  //clients = new ArrayList<Socket>();
    	  clients.add(cl);
      }
      
     public void serve(){//con questo metodo accetto le connessioni con i client
    	 Socket client = null;
    	 try {
    		client=serverSocket.accept();//instauro connessione con il client. Ricorda.accept() restituisce un socket
    		lista(client);
    		
    		System.out.println("client : "+clients.size());
    		//avvio un thread per ogni connessione accettata
    		Thread applicazione = new Applicazione(client);
    		applicazione.start();//metodo che avvia il thread
    	} catch (IOException e) {
    		System.out.println("Impossibile instaurare connessione con il client");
    		stop();//stoppo il server
    	  }
     }
      public static void main(String[] args){
    	  Server server = new Server(7777);
    	  server.start();
      }
    }
    grazie

  7. #7
    Ogni volta che invochi il metodo aggiorna() crei un nuovo ArrayList.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    285
    infatti ho corretto ... vedi sopra
    ps scusate ma non so il motivo per cui si è pubblicata 2 volte la stessa risposta!

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.