Newsgroup: it.comp.java
Titolo: Come estendere il main() da una superclasse ?

public class Server {
    public static void main (String[] args) throws IOException {
        ServerSocket serverSocket = null;	// boolean in_ascolto =
true;
	int porta = 4444;
        try {
            serverSocket = new ServerSocket(porta);
	    System.out.println("\n Server avviato :: MultiThreading sockets
<<in ascolto>> sulla porta " + porta + " ...");
        }
	catch (IOException e) {
            System.err.println(" > Impossibile rimanere in ascolto
sulla porta numero " + porta + ".");
            System.exit(1);
        }
	// FINCHE' IL Server RIMANE SEMPRE IN ASCOLTO
        while (true)    new ServerMultiThreading
(serverSocket.accept()).start();
        //serverSocket.close();
    }
}
Salve a tutti!!
Io ho questa classe Server.. per via di uno esercizio dovrei creare 2
server identici, chiamiamoli ServerUNO e ServerDUE, operanti ciascuno
su 2 porte diverse:
facciamo la 2222 per il ServerUNO e la 4444 per il ServerDUE.
Così ho pensato di creare 2 classi, chiamate ServerUNO e ServerDUE,
che estendono il codice di questa classe Server che vi ho postato.
La mia domanda è: come faccio a implementare ciò??
Cioè.. come faccio a fare partire.. a richiamare il metodo main()
della superclasse Server, ma indicando una diversa porta per le 2
classi estese.. (si dice "estese", vero?)
Vi Ringrazio Per L'Aiuto Che Saprete Fornirmi!
Ciao

Non ti conviene fare di "porta" un campo della tua classe, cosě che, a 
seconda della classe figlia che hai, lo setti come ti pare?
una cosa del tipo:
public class Server {
	public static void main(...)
		{...}
	private int porta=10; // tanto per dire....
}
public class ServerUNO extends Server{
	public ServerUNO(){
		super();
		porta=2222;}
}
public class ServerDUE extends Server{
	public ServerDUE(){
		super();
		porta=4444;}
}
Chiaro....poi volendo puoi, invece di usare le classi figlie, fare un 
costruttore in Server che setta direttamente la porta.....cosě avrai due 
Server con le porte diverse.
Spero di avere capito bene il tuo problema.
Ciao
Giordano ha scritto:


Grazie per la risposta, la logica che proponi tu è giustissima,
anch'io avevo pensato di ricorrere ad una variabile, ma al momento i
due Server, UNO e DUE, si connettono entrambi sulla stessa porta
(avente il valore inizializzato dalla superclasse).
Provo a seguire il secondo metodo.
Vediamo come va..
..Ciao

Niente da fare... non riesco a settare una porta diversa per le due
classi estese.
Entrambe finiscono per mantenere il valore numerico dichiarato nella
superclasse, inizializzazione che non può mancare là, e pertanto solo
il primo Server che si accende riesce a mantenersi in ascolto, l'altro
trova quella stessa porta occupata e pertanto non funziona.
:(

 Ciao
Forse ho capito male...
Ma se fai public class Server {
// blablabla
int porta;
public Server(int porta) {
this.porta=porta
//blablabla
e poi ti crei una classe ex-novo
public class Creatore {
main() {
Server server1 = new Server(2222);
Server server2 = new Server(4444);
server1.main(args);
server2.main(args);
Anche se č veramente brutto...io leverei il coidce per l'ascolto al main e 
lo metterei in un metodo publico separato, da richiamare al posto del 
main... 

 :(
....
Come, niente da fare??
Scusa, forse non mi sono spiegato prima, ma devi togliere la riga:
int porta = 4444;
dal main della classe originale.
Fammi sapere.

minki@... non mi funziona ??
:-o

 classi estese.
Che vuol dire non riesco?
Messaggi di errore?
Codice di esempio?
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/06/relazioni-molti-molti-con-jpa.html

non riesce a compilare.. quell' int porta serve dentro il blocco try-
catch.. non posso toglierlo, anzi lo devo tenere e anche
inizializzarlo.


Copia e incolla l'errore cosģ come esce dal compilatore e il pezzo di 
codice interessato se vuoi aumentare le probabilitą che qualcuno ti 
risponda.


Strano come questo esercizio non mi riesca.. sembrava così facile!!
Allora, se scrivo:
public class ServerUNO {
	public static void main (String[] args) {
		Server server1 = new Server(2222);
		server1.main();
	}
}
Mi da questo errore in fase di copilazione:
ServerUNO.java:7: main(java.lang.String[]) in Server cannot be applied
to ()
                server1.main();
                       ^
1 error
Se invece provo proprio ad estendere la classe Server
scrivendo questo codice
public class ServerUNO extends Server {
	public ServerUNO() {
		super(2222);
	}
	public static void main (String[] args) {
		new ServerUNO();
	}
}
l'applicazione compila correttamente, ma non parte il funzionamento
del Server (dovrebbe comparire un messaggio che conferma l'avvio del
server e che questo si trova adesso in ascolto sulla porta 2222, ma
non succede nulla)
Qui sotto posto anche il codice della classe ServerMultiThreading
import java.net.*;
import java.io.*;
public class ServerMultiThreading extends Thread {
    // CAMPI
    private Socket socket = null;
    // COSTRUTTORE
    public ServerMultiThreading (Socket socket) {
	super("ServerMultiThreading"); // A COSA SERVE?? E' Omissibile!!
	this.socket = socket;
    }
    public void run() {
	try {
	    PrintWriter out = new PrintWriter(socket.getOutputStream(),
true);
	    BufferedReader in = new BufferedReader(  new
InputStreamReader( socket.getInputStream() )  );
	    System.out.println("\n  [+]  Un nuovo Client si e' connesso sulla
porta remota n. " + socket.getPort() + "\n");
	    KnockKnockProtocol kkp = new KnockKnockProtocol(); /* QUESTA
CLASSE CONTIENE I METODI PER PERMETTERE AL SERVER DI ELABORARE LE
RICHIESTE DEL CLIENT E RESTITUIRGLIELE */
	    String inputLine, outputLine = null;
	    while ((inputLine = in.readLine()) != null)
	    {
		outputLine = kkp.processInput(inputLine);
		out.println(outputLine);
		// NON ENTRA MAI IN AZIONE	if (outputLine.equals("Bye"))    break;
	    }
	    out.close();
	    in.close();
	    // OMISSIBILE socket.close();
	}
	catch (IOException e) {
		System.out.print("\n  <!>  Il Client operante sulla porta remota " +
socket.getPort() );
		System.out.println(" e' andato giu'.\n       (Connessione interrotta
o resettata)\n");
	    // e.printStackTrace();
	}
    }
}

 Strano come questo esercizio non mi riesca.. sembrava cosě facile!!

Ma quando utilizzi la classe Server, questa sarebbe ServerMultiThreading 
extend Thread, giusto?
Allora non devi richimarne il main, ma devi creare l'oggetto e richiamarne 
il metodo run....no?
Poi, perchč creare due classi diverse quando basta creare due oggetti dello 
stesso tipo ma con la porta parametrizzata? 

 Allora, se scrivo:
Bravo che hai riportato l'errore e il codice, poi ti rispondo se non lo 
farà prima qualcun'altro.
L'unica cosa che dovresti fare la prossima volta è il quoting corretto.
Per piacere quota sempre il testo a cui stai rispondendo in questo modo 
chi legge il tuo posto non deve andare a leggersi i post precedenti per 
capire il filo del discorso. Inoltre, quando quoti cerca di scrivere 
sotto il testo quotato, in questo modo si ottengono post piu' naturali 
da leggere dove il lettore parte dall'alto e va verso il basso.


@toto: la mia era una prova, ma ancora non sono riuscito a fare
estendere questa classe Server..
come dici tu sarebbe giusto avere due istanze diverse di Server(), ma
il fatto è che ServerUNO e ServerDUE devono avere una "memoria
centrale condivisa".. così chiede l'esercizio.. e in più uno dei due
contiene dei dati non presenti nell'altro.
..ammettendo che questa memoria condivisa sia, per esempio, un'array,
posso realizzare "la condivisione" dei dati dichirando tale array in
modo 'static' ?
@Andrea: grazie dei consigli.. una domanda: quando posti una domanda/
risposta ti arriva una qualche email che ti avvisa che qualcun'altro
ha aggiunto un altro post dopo di te... oppure bisogna ogni volta
andare a connettersi e vedere se ci sono stati nuovi interventi dopo
il proprio ?
@tutti: oggi ho fatto esame di linguaggi (Java), io dico che è
inconcepibile pensare di chiedere a dei ragazzi di scrivere in 4 ore,
dal nulla, un'applicazione server multithreading / Client (svariati
clients).. tutti dotati di interfaccia grafica.. che si condividono
dati in memoria (tipo 3 server diversi che si condividono 2 strutture
di dati).. e in più questi server e/o client stanno in mutua
esclusione in lettura/scrittura su più files.. e tutti i metodi.. e
tutte le prove che bisogna fare...
4 ore, per me non bastano. Si tratta di circa 200/300 linee di
codice.. può uno studente sapere 200 linee di codice a memoria e
comunque 4 ore non bastano.. Voi che ne pensate ??

 comunque 4 ore non bastano.. Voi che ne pensate ??
La mia opinione, che immagino sia molto discutibile, è che gli esami 
siano difficili. Se fossero così facili che li si passa senza doversi 
preparare a che cosa servirebbero?
Per la mia esperienza ho visto che qualunque sia la difficoltà 
dell'esame gli studenti si lamentano comunque e lo vorrebbero un po' 
piu' facile.
Pero' è un argomento OT che mi interessa relativamente, avviso che 
potrei non rispondere alle risposte alla mia opinione.
-- 
Andrea Francia
http://www.andreafrancia.it/

Si, giusto.. ci lamenteremo comunque, anche se questo esame venisse
fatto a mo' di crocette (Io non mi lamenterei, ma molta gente lo
vorrebbe ancora più facile)


:)
