Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi N - Z > Reti di calcolatori
 
[ESERCIZIO] Thread
Clicca QUI per vedere il messaggio nel forum
GinoPilotino
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"); } }


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

futurbaggio
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

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:

GinoPilotino
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:


yeah
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:

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

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

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

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

yeah
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:

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

Dodo
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

yeah
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 :)

0m4r
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...

yeah
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ò.

yeah
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'.

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate