Newsgroup: it.comp.java
Titolo: Esempio socket con multithreading

Ciao a tutti :)
Ora vi posto il codice di 2 classi, Client & Server (perfettamente
funzionanti), che utilizzano un Socket per comunicare.
Come si rende tale esempio "in forma" multi-threading ??
Mi sapete aiutare..
			// 
http://www.slideshare.net/gerdavax/java-network-programming/
import java.io.*;
import java.net.*;
public class EchoServer {
	public static void main(String[] args) throws Exception {
		ServerSocket serverSocket = new ServerSocket(8899);
		Socket socket = serverSocket.accept();
		Reader reader = new InputStreamReader(socket.getInputStream());
		BufferedReader buffer = new BufferedReader(reader);
		PrintStream ps = new PrintStream(socket.getOutputStream());
		String read = "";
		while ( (read = buffer.readLine()) != null ) {
			System.out.println("Ricevuto: " + read);
			ps.println(read);
		}
	}
}
			// 
http://www.slideshare.net/gerdavax/java-network-programming/
import java.io.*;
import java.net.*;
import java.util.Date;
public class EchoClient {
	public static void main(String[] args) throws Exception {
		Socket clientSocket = new Socket("127.0.0.1", 8899);
		Reader reader = new
InputStreamReader(clientSocket.getInputStream());
		BufferedReader buffer = new BufferedReader(reader);
		PrintStream ps = new PrintStream(clientSocket.getOutputStream());
		String read = "";
		while ( true ) {
			ps.println(  new Date( System.currentTimeMillis() )  );
			System.out.println("Tornato indietro: " + buffer.readLine());
			Thread.sleep(200);
		}
	}
}
Io ho preso tale codice dalle slides presenti all'indirizzo
http://www.slideshare.net/gerdavax/java-network-programming/
,
e proprio alle slides di pagina 45 e 46 viene indicato come rendere
l'esempio multi threading...
...MA NON CI SONO RIUSCITO  :(  !!
Mi potete aiutare Voi, Grazie..
..Molto gentilmente Potreste indicarmi, se la conoscete, una risorsa
dove trovare un bell'esempio funzionante di Socket Multithreading che
opera tra un Server e più Clients sulla scrittura e lettura di un
File..
..Ragazzi, Vi ringrazio immensamente se potrete aiutarmi (soprattutto
a trovare l'esempio su scrittura e lettura di un File)
Ciao a Tutti
e Grazie
:)

 File..
Hai già provato a cercarlo su google?
-- 
Andrea Francia
http://www.andreafrancia.it/

Ciao, so che le slides sono troppo generiche,
ma - credetemi - non sono riuscito a trovare uno straccio di esempio
dove viene trattato l'argomento socket/multithreading condividendo un
file come risorsa comune...
...niente, nada, nada de nada: Google non mi ha aiutato..
.. ecco perchè quelle slides sono di quanto più si avvicini ad un
<<buon esempio>>
:)

 <<buon esempio>>
forse dovrei lasciar perdere ma la tentazione di dimostrarti che non hai
fatto la ricerca su google ha prevalso:
http://www.google.it/search?q=multithreading%2Bserver%2Bjava&ie=UTF-8&oe=UTF-8
il terzolink è proprio l'esempio che da la sun su soket e multithreading
http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/socket.html
ciao
Umberto

Si Umberto
avevo già visto quel 3° link ed ero riuscito a renderlo eseguibile...
ma un esempio che utilizzi i File (in lettura e scrittura) non si
trova da nessuna parte
eppure è un argomento tanto comune (almeno come prova d'esame nelle
università)
mah...
..la ricerca continua
:)

 :)
se spieghi meglio cosa vuoi ti si può dare qualche aiuto .....
Umberto

ciao Umberto,
si ho capito come funziona l'esempio Sun...
...quello che cerco io è un esempio dove Server e Clients
interagiscono su uno stesso file (per esempio un client scrive delle
info su un file e poi il Server acquisisce questo stesso file per
leggere le informazioni scritte dal Client)
(... o viceversa, cioè il Server scrive su file e poi i clients vanno
a leggere)

mejo...@gmail.com
 wrote:

come la presenti non è molto convincente secondo me sei un po confuso e ora
sono confuso anche io, forse è l'ora tarda....ma vediamo se ho capito.
tu vuoi scrivere delle informazioni su un file attraverso un protocollo di
rete e rileggere queste informazioni sempre attraverso la rete
quindi avrai bisogno di server che gestisca le chiamate dei client a seconda
se sono di lettura o scrittura (vedi syncronize, non credo che tu voglia
leggere mentre scrivi o permettere di scrivere a due client
contemporaneamente) e poi hai bisogno di un automa a stati finiti per la
comunicazione fra server e client (dovrai sapere se un client scrive o
legge)
c'ho preso?
Umberto

certo Umberto :)
Io cerco un esempio di sincronizzazione e la mutua esclusione: un solo
thread (x es. un client) acquisisce la risorsa file per scriverci
sopra (e tutti gli altri client e il server rimangono in attesa) e poi
il thread-server acquisisce la risorsa file per effettuare la lettura
delle informazioni scritte..
guarda ti posto il testo del compito che richiedeva proprio questa
implementazione di "multithreading socket in lettura/scrittura su un
file di testo" (la soluzione non è reperibile tra noi studenti)
Allora:
Un ufficio disbrigo pratiche auto e organizzato nel seguente modo.
Un'applicazione (Archivio) mantiene in una coda (la 1a richiesta
inoltrata e la prima ad essere posta in lavorazione) l'archivio delle
pratiche da evadere. Per ciascuna pratica sono mantenute le seguenti
informazioni:
 - Nome del cliente che ha inoltrato la richiesta
 - Data di consegna
 - Tipo di pratica
Ad ogni chiusura delle applicazioni deve essere salvato il contenuto
della coda in un file che dovrà essere ricaricato all'avviamento
dell'applicazione (se manca questo file va creata una coda vuota).
Ogni impiegato, identificato da un codoce, che si occupa del disbrigo
delle pratiche ha a disposizione un'applicazione (Disbrigo) che
consente all'impiegato (tramite un'interfaccia grafica)
di:
 - Richiedere al server la prima pratica in coda che aspetta di essere
evasa
 - Inserire nell'insieme delle pratiche pronte allo sportello una
delle pratiche prelevate dalla coda dopo aver aggiunto un
identificatico costituito dal proprio codice concatenato con un intero
che rappresenta il numero di pratiche evase dall'impiegato
Una terza applicazione (Sportello) consente di gestire lo sportello.
Tale applicazione (dotata di interfaccia grafica)
consente di:
 - Ricevuta da un cliente una richiesta di disbrigo di una pratica la
inoltra all'archivio delle pratiche in attesa
 - Gestisce le pratiche evase creando un insieme che contiene tutte le
pratiche già evase e ricevute dagli impiegati, ma non ancora
consegnate al cliente.
 - Consegna al cliente la sua pratica. In tal caso la pratica va
eliminata dall'insieme delle pratiche già evase ed in attesa di
consegna al cliente.
Ad ogni chiusura delle applicazioni deve essere salvato il contenuto
dell'insieme in un file che dovrà essere ricaricato all'avviamento
dell'applicazione.
All'avviamento, in assenza del file, va creato un insieme vuoto.
Il sistema deve consentire inoltre di effettuare delle valutazioni
statistiche in particolare:
 - Numero di pratiche mediamente presenti nella coda
 - Numero di pratiche mediamente presenti nell'insieme
 - Numero totale delle pratiche evase
 - Percentuale di pratiche evase da ciascun impiegato
Per effettuare tali valutazioni "ogni sera" alla chiusura delle
applicazioni saranno conservate su files la situazione giornaliera.
Consegnare:
1) codice sorgente, con ogni file avente per prima riga il cognome e
il nome
2) bytecoe
3) readme.txt con tutte le spiegazioni e scelte progettuali fatte
4) eventuali file di prova
5) inserire tutto in un cartella <Cognome_Nome>
Il programma deve essere funzionante (anche se incompleto) per essere
preso in considerazione.
Durata della prova: 4 ore
ECCO QUESTO ERA IL Testo di questa "assurda" prova: è un testo poco
chiaro, molti di noi studenti all'esame non hanno capito una mazza di
ciò che era richiesto.
Tralasciando l'implementazione grafica...
...qui ci vuole un thread 'Server' (denominata "Archivio") che scriva
su file la coda delle pratiche ottenute dal thread 'Client' (detto
"Sportello") che riempie una coda che conterrà le pratiche da
"elaborare in giornata" mentre l'altro Client ("Disbrigo") simula
l'elaborazione di queste pratiche (simulazione che avviene aggiungendo
ai dati della pratica il codice identificativo dell'operatore che sta
evadendo quella pratica) e elimina questa pratica dalla coda delle
pratiche (..lo so.. è un casino.. è tutto un gioco di parole) in
attesa di essere evase.
Poi questa pratica, appena evasa, va aggiunta all'insiem (cosa è un
insieme? Una coda, un file?? Mah) del Client "Sportello" che simulerà
la ri-consegna al legittimo proprietario.
Ragazzi io NON Vi chiedo la soluzione del compito,
ma vi chiedo di indicarmi in che modo dei threads Clienti possano
scrivere, a turno, delle info su un file e poi come un altro thread
Servente possa acquisire in lettura tale file, "elaborare" le info che
vi sono contenute, e restituire queste informazioni appena elaborate
ai clients.
Ciao Ragazzi, lo so che sto compito fa schifo,
aspetto di leggere i vostri interventi
Ciao
:)


Io l'ho capita così:
Lo Sportello è interfacciato con l'Archivio.
Lo Sbrigo è interfacciato con l'Archivio.
L'Archivio persiste i suoi dati in un file chiamato coda.
Lo Sportello mantiene una lista di pratiche già evase ma ancora da dare 
al cliene persistendo queste informazioni in un file.
Quindi hai:
Sbrigo -------- Archivio --------- Sportello
                    |                  |
                    |                  |
                file coda         file pratiche
Non devi cercare su internet un esempio che ti parli di comicazione 
client/server e contemporaneamente di scrittura/lettura file.
Devi cercare esempi sull'iterazione client server e esempi di sulla 
scrittura/lettura file. Sono due problemi separati.
Comunque quel compito è tosto, non so se riuscirei a completarlo in 4 ore.
L'interfaccia tra le applicazioni client-server le farei con RMI, è 
molto piu' semplice che andare a progettarsi da zero il protocollo per 
far passare queste informazioni.
Però tu invece pensi ad un architettura con base dati centralizzata:
Tutti scrivono sullo stesso file.
Per implementarla puoi usare le facility di locking di java.nio.


 a leggere)
da quello che ho capito, anche pensando ai miei esami, ti serve 
banalmente un sistema client-server solo che il canale di comunicazione 
deve essere un file, piuttosto che una pipe, un tunnel tra socket etc etc
dai un occhio al package java.nio.channels, che descrive per l'appunto
canali di comunicazione aperti verso entità capaci di operazioni di I/O,
come i files ad esempio....
Più in generale spulcia tutta la java.nio...
-- 
----------------------------------------------------------------------------------
       /)/)		La mia vita è tutta rose e fiori...
      ( '.')
    o(('')('')				... ma io sono allergico !!!

 Servente possa acquisire in lettura tale file, "elaborare" le info che
crei una classe AccediFIle e la fai usare alle altri classi per
l'accesso al file. Metti i metodi di lettura/scrittura in synchronized
cosi che si possa fare solo un operazione alla volta sul file.
Ciao Jack

 Per implementarla puoi usare le facility di locking di java.nio.
...aggiungerei che c'è bisogno di un metodo per scrivere e recuperare le
informazioni dai file, insomma se si potesse usare un database......se non
ho capito male la pratica ha quattro stati:accettata e quindi in attesa di
essere elaborata, in elaborazione, elaborata e consegnata, poi c'è la
questione protocollo che è un'altra lista, inoltre vuole le statistiche
giornaliere che fanno il sesto file....
....ma il tuo prof voleva fare un gestionale e non ha voglia di
scriverlo? ;-)
scherzo .....
magari lo sai già ma in caso di no quì si trovano una paccata di esempi
anche su i packages che ti ha segnalato Andrea
http://www.exampledepot.com/egs/index.html
facci sapere..
Umberto

Ciao a tutti,
oggi sono andato a fare l'esame scritto di java..
..il compito era un altro casino simile al testo che vi ho postato...
...ma ho avuto la fortuna di trovare, nel computer che stavo usando,
proprio la soluzione a quel primo testo!!
(Anche se non mi sembra molto funzionante)
Chi è interessato mi può contattare via email che gliela faccio avere
mejo...@gmail.com
Per quanto riguarda l'interfaccia da implementare con RMI... beh.. non
so cosa sia, ma tanto qui all'università sono più le cose NON
insegnate che quelle apprese.
Quel sito invece non lo conoscevo quindi grazie per avermelo segnalato
:)
Grazie a tutti per i vostri interventi..
..ripeto: chiunque fosse interessato a dare un'occhiata alla soluzione
di quello schifo di compito
mi può benissimo contattare via email
P.S: Io mi metto a studiare bene la 2a soluzione che ho trovato in
quel fortunato computer (un server/client con interfaccia grafica in
swing)
Speriamo che al prossimo appello sia la volta buona anche per me
Ciao e grazie a tutti
W la javaCollaboration !!