Visualizzazione dei risultati da 1 a 3 su 3

Discussione: Server multithread

  1. #1
    Utente di HTML.it L'avatar di godx3
    Registrato dal
    Apr 2008
    Messaggi
    37

    Server multithread

    Salve, secondo voi cosa è che non va in questo codice? Il server si pone in stato di accept, ma non accetta la connessione di un client:
    codice:
    public class Server {
    
    	private ArrayList <Socket> clients;
    	private ServerSocket server;
    	
    	private ArrayList <ObjectInputStream> inputs;
    	private ArrayList <ObjectOutputStream> outputs;
    	
    	private Executor esecutoreThreads; 
    	
    	public Server(int porta,int coda) {
    		esecutoreThreads = Executors.newCachedThreadPool();
    		creaSocket(porta,10);
    		
    		esecutoreThreads.execute(new AcceptTask());
    	}
    	
    	
    	private class AcceptTask implements Runnable {
    
    		public void run() {
    			System.out.println("Sono in attesa di un client...");
    			accettaClient();
    			System.out.println(numeroPeerConnessi());
    			esecutoreThreads.execute(new AcceptTask());
    		}
    		
    	}
    	
    	public int numeroPeerConnessi() {
    		return clients.size();
    	}
    	
    	public void terminaServer() {
    		
    			try {
    				for (int i = 0; i < inputs.size() || i < outputs.size() || i< clients.size(); i++) {
    					inputs.get(i).close();
    					outputs.get(i).close();
    					clients.get(i).close();
    				}
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    		
    	}
    	
    	private void creaSocket(int porta,int coda) {
    		try {
    			server = new ServerSocket(porta,coda);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	private void accettaClient() {
    		try {
    			Socket temp = server.accept();
    			ObjectInputStream input = new ObjectInputStream(temp.getInputStream());
    			ObjectOutputStream output = new ObjectOutputStream(temp.getOutputStream());
    			output.flush();
    			clients.add(temp);
    			inputs.add(input);
    			outputs.add(output);
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    
    }
    Il client è invece:
    codice:
    public class Client {
    	
    	private Socket server;
    	
    	private ObjectInputStream input;
    	private ObjectOutputStream output;
    	
    	public Client(String indirizzo, int porta) {
    		connect(indirizzo,porta);
    	}
    	
    	public void terminaClient() {
    		try {
    			input.close();
    			output.close();
    			server.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    	
    	private void connect(String indirizzo, int porta) {
    		try {
    			
    			server = new Socket(indirizzo,porta);
    			input = new ObjectInputStream(server.getInputStream());
    			output = new ObjectOutputStream(server.getOutputStream());
    			System.out.println("Sono connesso a" + server.getLocalPort());
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    }
    Uso un main in cui faccio partire il server:
    codice:
    public class MainServer {
    
    	public static void main(String[] args) {
    		Server server = new Server(4000,10);
    		
    	}
    }
    E un main per far partire i client:
    codice:
    public class MainClient {
    	public static void main(String[] args) {
    		Client client = new Client("127.0.0.1",4000);
    	}
    
    }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,326

    Moderazione

    Quando posti il codice, utilizza i tag [code] e [/code], così rimane leggibile e mantiene l'indentazione.

    Ho modificato io il tuo post precedente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Scusa ma dire che e' strutturato male e' perfino un complimento... detto questo dovtresti postare il codice della classe Executor.
    Personalmente, poi, estenderei la classe Thread anziche' implementare Runnable.
    Imho e' piu' intuitivo.

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.