.dsy:it.
Show 150 posts per page

.dsy:it. (http://www.dsy.it/forum/)
- Reti di calcolatori (http://www.dsy.it/forum/forumdisplay.php?forumid=68)
-- [ESERCIZIO] Thread (http://www.dsy.it/forum/showthread.php?threadid=14000)


Posted by GinoPilotino on 09-10-2004 16:57:

Esercizio thread

Ragazzi avete provato a casa a creare la connessione client - server tramite thread e a compilarla?
Probabilmente ho preso male appunti io però non mi va. Io ho scritto il codice come segue:



in linea teorica mi sembra giusto quello che ho fatto però in fase di compilazione mi dice che il metodo run non accetta le eccezioni; se lo tolgo però succede un mezzo casino.
qualche suggerimento? a voi va?

code:
import java.net.*; import java.io.*; public class Servert { public static void main(String args[]) throws Exception { // variabili String frase="Ciao sono il server"; ServerSocket server=null; Socket servizio=null; boolean connessione=true; OutputStream canale; int i; // programma Smista t; try { server = new ServerSocket(1000); } catch(IOException e) { System.out.println("Connessione Fallita"); connessione=false; } while(connessione) { System.out.println("\n\nServer in attesa di connessione"); servizio = server.accept(); t = new Smista(servizio, frase); t.start(); } } } class Smista extends Thread { // variabili OutputStream canale; Socket serviziothread=null; String frasethread; // programma public Smista(Socket servizio, String frase) { this.serviziothread = servizio; this.frasethread = frase; } public void run() throws Exception { canale = serviziothread.getOutputStream(); for (int i=0; i<frasethread.length();i++) { canale.write((int)frasethread.charAt(i)); sleep(1000); } serviziothread.close(); System.out.println("Servizio erogato"); } }


Posted by 0m4r on 09-10-2004 17:39:

Off-Topic:
usa il tag {code}{/code} oviamente cone le [] al posto delle {}, il codice sarà piu leggibile

__________________
http://www.twitter.com/0m4r


Posted by futurbaggio on 09-10-2004 19:50:

Re: Esercizio thread

code:
while(connessione) { System.out.println("\n\nServer in attesa di connessione"); servizio = server.accept(); t = new Smista(servizio, frase); t.start(); }


Non è che questo va dentro ad un try...catch???

Cmq se riporti proprio quello che ti restituisce il compilatore è meglio.

Roberto

__________________
E lo sceriffo americano non lo sa / ma quando parla ride tutta la città / vile fellone vieni a singolar tenzone / unza unza umpappà troppe truppe mariscià.
Non ci voleva l'eruzione della lava / e due piccioni si contendono la fava / sposa bagnata, bambina svergognata / la questione è delicata / come bolle la patata.
Basta! E' finita la festa
[L'ovile delle vanità, Folkabbestia]


Posted by yeah on 09-10-2004 20:34:

:)

Non puoi mettere a run() il throws, mi ci sono imbattuto anch'io.

Metti il codice di run() in un try-catch e ricompila :approved:

__________________
?


Posted by GinoPilotino on 10-10-2004 02:16:

Originally posted by yeah
:)

Non puoi mettere a run() il throws, mi ci sono imbattuto anch'io.

Metti il codice di run() in un try-catch e ricompila :approved:


ho seguito il tuo consiglio ( :approved: ) è ho ricostruito la classe che gestisce il thread come segue:

public void run() {
try {
canale = serviziothread.getOutputStream();
for (int i=0; i<frasethread.length();i++) {
canale.write((int)frasethread.charAt(i));
// sleep(1000);
}
serviziothread.close();
System.out.println("Servizio erogato");
}
catch(IOException e){}
}

Così com'è funziona anche se mi da un problema quando chiamo sleep che mi dice che deve essere per forza in un throws Exception.
In ogni caso non riesco a capire perchè al prof andava mettendo throws exception nel metodo run e a me no :shock:


Posted by yeah on 10-10-2004 08:14:

Ecco: sleep() lancia InterruptedException, che nella gerarchia sta sotto ad Exception, quindi probabilmente nella catch() ci va Exception (o InterruptedException) anzichè IOException


In ogni caso non riesco a capire perchè al prof andava mettendo throws exception nel metodo run e a me no

Boh! Mi sa che mi sono distratto a lezione e non ho visto questo particolare.

Cmq appena ho un po' di tempo posto il mio codice e vediamo cosa c'è di diverso.

:)

P.S.:
Oggi alle 03:22
:zzz:

__________________
?


Posted by GinoPilotino on 10-10-2004 09:17:

ok perfetto ho fatto come hai detto tu e mettendo Exception solo nel catch funziona tutto perfettamente ;)


Posted by Principessa on 10-10-2004 13:39:

catch(Exception e) {
e.printStackTrace();
}

questo quanto appreso dal corso di SOD (Programmazione Concorrente in Java)


Posted by GinoPilotino on 10-10-2004 14:02:

si ora il codice funziona perfettamente. In ogni caso sto cercando di capire come mai al professore andava tutto bene in aula mettendo throws Exception al metodo run() del thread mentre io se lo faccio sul pc java mi smadonna dietro:? :D


Posted by yeah on 10-10-2004 14:03:

Originally posted by Principessa
catch(Exception e) {
e.printStackTrace();
}


:schoked:

:) Quello fa si che in caso si verifichi una eccezione, la Java Virtual Machine stampi lo stack delle chiamate (cioè quale funzione ha chiamato quale funzione che ha chiamato quella che ha generato l'eccezione)

Quindi diciamo che è buona norma metterlo: :approved:

__________________
?


Posted by yeah on 10-10-2004 14:07:

[edit] ma che ancora? Stavolta non ho postato! Stavo editanto, poi sono tornato indietro e tac! Doppio post. Bug?

__________________
?


Posted by Dodo on 10-10-2004 14:23:

Originally posted by yeah
[edit] ma che ancora? Stavolta non ho postato! Stavo editanto, poi sono tornato indietro e tac! Doppio post. Bug?

Off-Topic:

http://www.dsy.it/forum/announcement.php?forumid=7

__________________
E' meglio essere ottimisti ed avere torto piuttosto che pessimisti ed avere ragione.

Albert Einstein


Posted by yeah on 10-10-2004 14:55:

Visto che hai quotato il mio post, spero almeno tu l'abbia letto :-/

Non ho postato, stavo editando. Invece che inviare le modifiche ho cliccato su "Indietro" nel browser :)

__________________
?


Posted by 0m4r on 10-10-2004 16:27:

Originally posted by GinoPilotino
si ora il codice funziona perfettamente. In ogni caso sto cercando di capire come mai al professore andava tutto bene in aula mettendo throws Exception al metodo run() del thread mentre io se lo faccio sul pc java mi smadonna dietro:? :D


io non ho visto il codice che avete usato a lezione, ma forse posso azzardare perchè al lui funzionava e a te no.

Usando throws l'eccezione viene sollevata e lasciata da gestire al metodo chiamante. Quindi probabilmente, nel cosice del professore, il metodo che solleva l'eccezione (cioè quello con throws) era racchiuso in un try/catch o a sua volta aveva un throws che rimandava la gestione dell'eccezione al suo metodo chiamante. Forse non è chiarissimo, ma più o meno si capisce dai...

__________________
http://www.twitter.com/0m4r


Posted by yeah on 11-10-2004 01:11:

Farò delle prove, ma se la memoria non m'inganna (il che non è da escludersi ;)) quando l'ho fatto in Silab mi diceva qualcosa del tipo che run() non può fare il throws, perchè è un metodo in overload. Proverò e comunicherò.

__________________
?


Posted by yeah on 11-10-2004 20:31:

Posto la mia soluzione, naturalmente non è l'unica ;)

Server - Server.java

code:
import java.net.*; import java.io.*; class Server { public static void main(String args[]) { ServerSocket listener = (ServerSocket) null; //necessario altrimenti potrebbe non essere inizializzato Socket established; try { //Apertura socket di ascolto listener = new ServerSocket(7000, 300); } catch(IOException e) {} while(true) { try { System.out.println("Server: In attesa di connessioni..."); established = listener.accept(); /* * Accettazione richiesta di connessione * e passaggio del socket creato ad un nuovo thread */ System.out.println("Server: Connessione accettata e lancio nuovo thread"); (new CliManager(established)).start(); } catch(Exception e) {} } //listener.close(); //codice irraggiungibile a causa del while(true) } }


Gestione tramite thread - CliManager.java
code:
import java.net.*; import java.io.*; import java.util.Random; class CliManager extends Thread { private Socket passedSocket; private String toSend; private OutputStream sock_out; private static Random rand; // Generatore di numeri casuali public CliManager(Socket s) throws Exception { System.out.println("CliManager: Creazione nuovo CliManager " + getName()); toSend = "Hello Net World!\n"; /* * Ricezione del socket creato dal server * e ottenimento dello stream di output */ passedSocket = s; sock_out = s.getOutputStream(); rand = new Random(); } public void run() { int slength; try { System.out.println(getName() + ": Inizio invio dati al client"); slength = toSend.length(); //Invio carattere per carattere della stringa for(int i = 0; i < slength; i++) { sock_out.write((int) toSend.charAt(i)); sleep((rand.nextInt(4) + 1) * 500); //Attesa casuale tra 0.5 e 2 secondi } System.out.println(getName() + ": Fine invio dati al client"); passedSocket.close(); } catch(Exception e) {} } }


Come client ho usato quello visto a lezione

Tuttavia non sono riuscito a mettere il 'throws' a run(), in quanto il compilatore dice che non si può porre in overload il metodo run() poichè la versione ereditata non fa il 'throws'.

__________________
?


All times are GMT. The time now is 10:56.
Show all 16 posts from this thread on one page

Powered by: vBulletin Version 2.3.1
Copyright © Jelsoft Enterprises Limited 2000 - 2002.