Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Ancora su Client/Server

Prima o poi mi ci metterò...
Una delle cose più importanti emerse dalle altre discussioni è che un
applicativo "Server" serio (qualsiasi sia il suo scopo, anche se la mia
fissa è un motore database) non possa eseguire le varie richieste che i
Clients gli fanno in semplice cascata, della serie "chi primo arriva meglio
si accomoda e gli altri aspettano i miei porci comodi".
Questa cosa per me è già da ansia perchè mentre ben capisco come si possano
avviare più istanze di uno stesso server, non riesco nemmeno lontanamente a
concepire (nemmeno pensando al multiprocessore) come un computer possa fare
due cose nello stesso tempo. Se n'è parlato tanto tempo fa, ma la
conclusione fu che nessun computer al mondo può fare due cose nello stesso
istante. Può elaborare più istruzioni "in parallelo", può distribuire e
ottimizzare l'esecuzione complessiva, ma non può non rispettare la sequenza
delle istruzioni stesse (nè, se permettete, deve). Quindi, anche ammettendo
di avere 8000 istanze di un server con le orecchie dritte, com'è possibile
che ciò si traduca in minori tempi di esecuzione? Ovvero, ipotizzando di
dover fare "n" volte un certo lavoro, com'è possibile fare in modo che "n"
istanze facciano quel lavoro (quei lavori) in tempi inferiori a quelli di
una singola istanza che esegue "n" volte quel lavoro in sequenza?
Poi, come se quanto sopra fosse robetta, come caspita si crea un "server"?
Ok, è una tipologia ben precisa di un progetto VB, ma, al di là di come si
costruisce e di quel che fa, come lo fa? Come posso cioè "comunicare" dai
vari client col server stesso (da e per). Forse per la mia stessa carenza
mentale di cui sopra, non so, per esempio, se un'istanza "nasce" nel momento
stesso che un client ne fa richiesta, ma come ne fa richiesta? Lancia un EXE
(perchè, sia chiaro, il server che intendo io non è in memoria e non è
nemmeno locale, è un applicativo che sta su una macchina in rete locale, il
server, appunto, e si pone in ascolto, riceve, esegue e restituisce) o
pastrocchia con COM? E, appunto, COMe?
Per intenderci e per ammettere la mia ignoranza maxima, oggi come oggi
avvierei un EXE normalissimo su una macchina che si limita a rilevare se in
una certa cartella vi sono certi tipi di file. Se sì li legge, interpreta e
ne scrive altri. I client creano nella stessa cartella (chiaramente
condivisa) i file che servono per le richieste al server e leggono quelli
che sono, convenzionalmente, le risposte del server stesso. "L'è 'na bugada"
(dicasi per oneroso lavaggio di panni), me ne rendo conto, pur riferendomi
esclusivamente ai "tempi di reciproca comunicazione", ma davvero, mettendo
insieme il discorso delle varie istanze e della reciproca comunicazione fra
client e server, non ho altra idea.
Per una volta... 3 righe di codice in VB? Un server multiistanza in rete
locale, che possa comunicare con due o più client recependo dagli stessi un
numero e restituisca agli stessi lo stesso numero raddoppiato. Grazie.

 (chiaramente condivisa) i file che servono per le richieste al server
Un applicazione server che legge le richieste e le mette in coda, un altra
applicazione server ma non esposta che legge sequenzialmente la coda  e si
"nutre" di essa un applicazine client che copia il file e invia un segnale
TCP alla coda.
Per il codice non riesco a fartelo adesso...
-- 
MAX
http://www.birreonline.net
Chi beve birra campa cent'anni

 numero e restituisca agli stessi lo stesso numero raddoppiato. Grazie.
fammi leggere anche gli altri post che arriveranno, poi magari scrivo
qualcosa.....
good coding!!!
-- 
Alletun
Sorry, ask me if you want to get my e-mail!

 molto di più.
<eg>
scusa non ho resistito...

 Per il codice non riesco a fartelo adesso...
Beh, ma scusa, questo son capace di farlo (almeno coi file) in 3 minuti
netti, ma è un'esecuzione sequenziale... e le multi-istanze?

 momento.
Va bene. Mentre mi č facile paragonare ai 1000 EXE ai 1000 Client, non
riesco a concepire cosa e come possa fare il singolo server a rispondere a
piů di un client per volta e non in pura sequenza.
E, se fosse possibile, come creare "n" istanze dello stesso server (sempre
nella memoria della singola macchina che funge da server) e farle lavorare
in contemporanea...

 mi spieghi come a un bambino? ;-)
:-)))
non so esattamente definirti cosa sia un cluster, però se hai voglia, cerca
qualcosa su Beowulfe sotto Linux. E' un applicativo che permette di creare
una rete LAN per il calcolo parallelo. C'è un articolo su Linux Magazine del
mese scorso: c'era proprio un esempio di come creare una LAN per questo
discorso. Molto brevemente: c'è un server che demanda ai client il lavoro da
fare; il server ha il controllo di tutta la situazione, non chiedermi
esattamente come, sotto Linux so meno di zero. Lo scopo era quello di usare
un softwae come PovRay per renderizzare un'immagine complessa. Qui credo
comunque che il calcolo parallelo ci fosse a tutti gli effetti, dato che
ciascun client svolge il proprio lavoro e lo restituisce al server......


 minuti netti, ma è un'esecuzione sequenziale... e le multi-istanze?
L'applicazione che legge la coda crea un 3d per ogni richiesta che deve
soddisfare.


 in contemporanea...
uhm uhm. non so esattamente. per esempio, sql server (visto che ti piacciono
i db) consente di essere installato sullo stesso PC per più di una volta,
ciascuno con una propria istanza. Però non so se ogni istanza lavora su una
porta diversa oppure no (a memoria, non credo).
però, dai, facciamo analisi.
1000 file con nome raddoppia.exe stanno sul server. Tutti vanno a leggere,
mettiamo ogni 10 secondi, su una stessa cartella condivisa da tutti.
Quando uno qualsiasi di quei 1000 exe in costante esecuzione rileva un nuovo
file txt da elaborare, lo locca in qualche modo, lo elabora e scrive un file
di output (magari generando il nome output con un GUID).
però, sottolineo una cosa: per evitare la pura sequenza, bisogna dare un
*peso* ad ogni richiesta. Un client potrebbe chiedere qualcosa di complesso,
un altro client un'altra cosa più semplice (penso come te ai vari costrutti
SQL di un qualsiasi rdbms). Questo peso viene deciso da un preprocessore,
che a quanto ne so stima il tempo di esecuzione di un sql; gli algoritmi
sono veramente complessi, credo, magari qualche mega-esperto di SQL Server o
Oracle ne sa sicuramente di più......
qua invece è un po' diverso. Se vuoi fare un server che NON vada in
sequenza, devi anche stabilire quali criteri vuoi applicare per privilegiare
un client o l'altro.....nel tuo caso cosa fai?


 scusa non ho resistito...
gnè gnè, figurati.....
:-PPPPppppPPPPP


 :-))))
Cliente
Clinicamente Deficiente.....
;-)

 
Perche' non provi a studiare uno degli esempi che trovi nei CD di VB. 
Sono illustrati abbastanza bene nella guida.
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 privilegiare un client o l'altro.....nel tuo caso cosa fai?
Nel mio caso ... ripeto, devo solo capire (per poi tentarne la
realizzazione) come sia possibile far fare in un certo istante alla stessa
macchina piů cose. A me fuma la testa e non lo capisco. Non oso dire che č
impossibile, assolutamente impossibile per qualsiasi macchina al mondo, ma č
quello che penso... ;-)

 Sono illustrati abbastanza bene nella guida.
Sì, effettivamente credo che sia il modo più produttivo.

 Prima o poi mi ci metterò...
Tutto un CUT
Prova a dare un'occhiata ai componenti OutOfProcess (EXE ActiveX) e a DCOM
...
potresti usare anche i socket o le pipeline o servizi di Queuing ma te lo
sconsiglio .. se devi fare un'app. client/server vuol dire che non hai tempo
da perdere per reinventare l'acqua calda.
Se vuoi domani ti mando un'app client e una server con tecnologia DCOM ...
le puoi eseguire entrambe sulla stessa macchina oppure su macchine
separate - e di certo non devi mettere mano a parametri come la RemotePort
RemoteIP ecc.. -
Saluti

 RemotePort RemoteIP ecc.. -
Voglio! Se domani sarai sempre dell'avviso, in qualche modo, con te ed
altri, comunicheremo, qui o altrove.

Caro Lupo,
Adesso vediamo di mettere un pò le cose insieme.
Un socket è molto simile ad un file, nel senso che puoi scrivere su o
leggere da esso
delle informazioni. A differenza dei files, però, quando ci sono dati da
leggere o
scrivere, ricevi un segnale. Quando ricevi il segnale, puoi compiere
l'operazione.
Senza entrare nei dettagli del protocollo IP e del routing( che
richiederebbe un
sacco di tempo da spiegare ), puoi vedere i dati che viaggiano in rete come
dei
pacchetti, quando un pacchetto arriva viene aperto ed esaminato dallo
"stack" di rete,
cioè da un driver che identifica la porta a cui è destinato ed il protocollo
utilizzato.
Tieni conto che su ogni porta per ogni singolo protocollo ci puo' essere in
esecuzione UN solo server. Questo significa che sulla porta 80 - per
esempio -
puo' esserci un solo server TCP ed un solo server UDP.
Per quanto vengano parallelizzati, in realta' TCP è un protocollo che
"deriva" da
UDP, solo che a differenza di quest'ultimo ha un controllo d'errore.
Quando un pacchetto UDP si perde sta al server "verificare" se deve essere
richiesto
nuovamente, mentre col TCP è lo stesso stack di rete a richiedere il
pacchetto mancante.
Veniamo ai server veri e propri.
Tieni conto che quanto sto per dire non si applica a VB, poiché VB non
supporta il
multi-threading, ed è per quello che nessuno penserebbe mai di fare un
server in VB :-).
Il server sta in ascolto, ogni volta che arriva una richiesta di connessione
semplicemente
avvia un nuovo thread, in modo da poter far lavorare le diverse richieste in
parallelo.
Questo vuol dire che, nonostante le richieste siano eseguite in modo
sequenziale( non
dimentichiamo che esiste il time-slicing ed il round-trip ring nello
scheduling dei
processi e thread ) sembrano parallele proprio perché il time-slice è molto
piccolo(
nell'ordine dei microsecondi ).
Se dovessimo disquisire su come avviene il parallelismo simulato attraverso
lo
scheduler, ci vorrebbe un libro solo per esso, quindi lo diamo per assunto.
Veniamo ora ai cosiddetti "cluster".
Un cluster è semplicemente un programma che riceve dal server un compito e
lo
esegue, un pò come un servizio NT nel computer locale.
Quando ha finito il suo pezzo di elaborazione, dice al server "ho finito" e
gli
pone il risultato. Questo è chiamato "grid computing"( calcolo a griglia )
poiché ci
sono molti PC( una griglia, appunto ) ad eseguire compiti coordinati dal
server, il
quale rimette insieme i risultati da fornire poi al client.
Il clustering è molto utile quando si vogliono creare sistemi
"fault-tolerant", cioè
resistenti agli errori, poiché se un client non è piu' in grado di operare,
esistono
altri computer che possono sostituire quello mancante, accollandosi un pò di
lavoro in piu', nel frattempo che il PC viene aggiustato/sostituito.
Spero di non averti confuso le idee ancora di piu', se hai bisogno scrivi.
Ciao,
Andrea

 "n" volte quel lavoro in sequenza?
Una semplice lettura da disco è un operazione *lentissima* se paragonata
alla velocità del processore. Questo implica che la CPU passa la
maggior parte del suo tempo a non fare nulla aspettando il completamento
delle operazioni demandate ad altre periferiche.
Questo tempo può essere sfruttato per eseguire istruzioni di un altro
processo o di un altro thread, ed ecco perché n istanze (thread od altri
processi) riescono ad essere più veloci di una sola istanza che svolge n
operazioni una dopo l'altra.
Per essere (spero) più chiaro ti faccio un esempio pratico un po'
semplificato:
mettiamo che il server, per rispondere al client debba fare un qualcosa
del genere
10 ms di calcolo, 40 ms di attesa di dati da disco, 10 ms di calcolo.
In tutto sono 60 ms per smaltire una richiesta.
Se arrivano 5 richieste il tempo per smaltirle tutte, nel caso queste
venissero eseguite in modo sequenziale, sarebbe di 300 ms, mentre nel 
caso venissero eseguite in parallelo (più thread o più  processi) si 
potrebbe ridurre il tempo fino a 100 ms.
Il modo per eseguirle in parallelo è questo:
parte il thread (o processo) 1, calcola per 10 ms, poi si mette in
attesa quindi parte il thread 2, calcola per 10 ms e si mette in attesa,
parte il thread 3, ecc... finiti i 40 ms di attesa il thread 1 riparte
calcolando per gli ultimi 10 ms, nel frattempo il thread 2 avrà finito
il suo tempo di attesa e così potrà terminare la sua richiesta, e così
via....
Ciao.
-- 
BSD is for UNIX lovers -- linux is for Windows haters.

 raddoppiato. Grazie.
Prendi 
VB.NET
 crei un progetto WebService, ci metti dentro
la funzione somma(p1, p2) che fa appunto la somma di p1 con p2.
Lo compili  e lo referenzi dal client. Sul client è una solo riga di codice
sul server tre.
--
Saluti e salute a tutti.
________________
Gabriele Del Giovine [Microsoft MVP] - Windows 2000 - Windows NT 4.0
- Le informazioni fornite in questo messaggio sono fornite
  senza vincolo di garanzia e senza responsabilità alcuna

 codice sul server tre.
Grazie, ma non ho Net, nè lo comprerò.
Se WebService è in qualche modo paragonabile a IIS/ASP, non è quello che
desidero.
Vorrei farlo, potendo, in VB6.

 provenienti da più client? Sarà sì, spero,
E' si, abbi fede.
Saluti.

 farle lavorare in contemporanea...
Eddaie. Ma un giretto sulla MSDN dove si parla di architettura
di SQLServer no eh? Al limite un giretto su goole per cercare come si
scrive un'applicazione client/server socket con allocazione dinamica dei
socket
in VB?
Saluti.

 Vorrei farlo, potendo, in VB6.
Sta pure sui CD di VB6.Guarda in mezzo agli esempi.
Saluti.

 Sta pure sui CD di VB6.Guarda in mezzo agli esempi.
Grazie, mi sei stato di grande aiuto.

[*Gabriele Del Giovine [MVP]* = gabriele_@_
delgiovine.it
 in
news:bpr1ml$1tqt$
1...@newsreader1.mclink.it
] ha scritto:

Sě, hai ragione, avrei dovuto leggere i BOL e cercare su Google.
Grazie dell'aiuto.

 Grazie, mi sei stato di grande aiuto.
Lo so.
Saluti.

 Lo so.
Simpatico, modesto.
EOF

> .NET è gratis.
madài
devo dirlo subito a TUTTI i negozi che lo vendono a carissimo prezzo!!!
pensa che loro non lo sanno, che è gratis.
... forse però lo si crakka gratis...
;-))


Mi trovi un negozio che vende .NET Framework?
Parlo di .NET non di Windows.
Saluti.

[*Gabriele Del Giovine [MVP]* = gabriele_@_
delgiovine.it
 in
news:bpvoag$1e51$
1...@newsreader2.mclink.it
] ha scritto:


E io insisto su quel che tu ti ostini a non quotare:
Noi, in questo NG, programmiamo in VB usando esclusivamente il NotePad.
A parte Windows, il NotePad è certamente gratis e persino il MSVBVM60.DLL.
Quindi, dici tu, "VB è gratis".
Tu stai dicendo questo. Tu stai dicendo delle sciocche verità.
PS: Ma tu, sì, proprio e personalmente tu, hai guadagnato il tuo MVP a forza
di questo tipo di post?
Sai com'è, sono convinto di no, ma mi sta venendo il dubbio...

 Sai com'è, sono convinto di no, ma mi sta venendo il dubbio...
Anche peggiori di questo :-)
Saluti.

[*Gabriele Del Giovine [MVP]* = gabriele_@_
delgiovine.it
 in
news:bq01su$1jud$
1...@newsreader2.mclink.it
] ha scritto:
...
Sono sconcertato.
Vabbè, lasciamo perdere.