Discussione:
Esempio socket con multithreading
(troppo vecchio per rispondere)
m***@gmail.com
2008-04-07 15:18:22 UTC
Permalink
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
:)
Andrea Francia
2008-04-07 15:44:48 UTC
Permalink
Post by m***@gmail.com
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 :( !!
Troppo generico. Perché non sei riuscito.
Cercati dei tutorial completi.
Solitamente le slide non sono complete.
Post by m***@gmail.com
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..
Hai già provato a cercarlo su google?
--
Andrea Francia
http://www.andreafrancia.it/
m***@gmail.com
2008-04-07 19:11:32 UTC
Permalink
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>>
:)
Umberto Carrara
2008-04-07 19:30:47 UTC
Permalink
Post by m***@gmail.com
Google non mi ha aiutato..
.. ecco perchè quelle slides sono di quanto più si avvicini ad un
<<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
m***@gmail.com
2008-04-07 20:12:43 UTC
Permalink
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
:)
Umberto Carrara
2008-04-07 20:32:45 UTC
Permalink
Post by m***@gmail.com
Si Umberto
avevo già visto quel 3° link ed ero riuscito a renderlo eseguibile...
..che ti funzioni è una cosa buona ma tu l'hai capito perchè funziona?
Post by m***@gmail.com
ma un esempio che utilizzi i File (in lettura e scrittura) non si
trova da nessuna parte
vuoi fare quindi un server che riceva informazioni dai client e li salvi su
un file?
non capisco il tuo obbiettivo!
Post by m***@gmail.com
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
m***@gmail.com
2008-04-07 21:02:45 UTC
Permalink
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)
Umberto Carrara
2008-04-07 21:23:43 UTC
Permalink
Post by m***@gmail.com
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)
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
m***@gmail.com
2008-04-07 22:20:01 UTC
Permalink
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
:)
Andrea Francia
2008-04-07 23:03:40 UTC
Permalink
Post by m***@gmail.com
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)
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
- 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)
- 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)
- 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
- 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.
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.
--
Andrea Francia
http://www.andreafrancia.it/
Umberto Carrara
2008-04-08 07:31:14 UTC
Permalink
Post by Andrea Francia
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.
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.
...con la botta che ho stamani neanche fra 4 giorni...... ;-)
ma con "funzionante" intende anche classi e metodi abbozzati e finti ma che
compili o proprio che doveva fare alcune operazioni concretamente?
Post by Andrea Francia
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.
Tutti scrivono sullo stesso file.
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
m***@gmail.com
2008-04-08 16:44:45 UTC
Permalink
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
***@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 !!

Jack
2008-04-08 06:32:27 UTC
Permalink
Post by m***@gmail.com
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
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
STB_Caos
2008-04-07 23:37:12 UTC
Permalink
Post by m***@gmail.com
(... o viceversa, cioè il Server scrive su file e poi i clients vanno
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 !!!
Loading...