[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? |
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'. |
|
|
|