Newsgroup: it.comp.java
Titolo: Stringhe parametrizzate? O altri modi per realizzare un protocollo?

Ciao a tutti,
sto creando un applicazione client/server in JAVA nella quale client e 
server comunicano scambiandosi vari messaggi.
Queste sono alcune delle operazioni che il client potr� fare:
- effettuare il login (inviando al server username e password forniti 
dall'utente e ricevendo in risposta la comunicazione sull'esisto 
dell'autenticazione)
- visualizzare le informazioni di alcuni file (per esempio il nome, la data 
di creazione, la dimensione, ecc.)
- effettuare il logout (inviando al server lo username dell'utente di cui 
effettuare il logout in modo che il server possa registrare data e ora 
dell'effettivo logout)
- ecc.
Il problema che devo affrontare � la creazione del protocollo di 
comunicazione tra client e server.
Per esempio, quando il client vuole loggarsi potrebbe inviare al server il 
seguente messaggio:
REQUEST LOGIN FOR pippo WITH PASSWORD pluto
Il server allora risponderebbe in questo modo:
LOGIN ACCEPTED
o
LOGIN REFUSED
In altri casi per� il client invierebbe il messaggio seguente al server
REQUEST FILEINFO FOR conferenza.doc
E il server risponderebbe in questo modo:
FILENAME = conferenza.doc   DATE_CREATION = 03/06/2008   DATE_MODIFIED = 
25/05/2009   SIZE = 431036   ATTRIBUTES = -rwxr--r--
Questo per dire che i tipi di messaggi sono diversi e ognuno ha un numero 
differente di parametri, spesso imprevedibile in anticipo (per chi riceve il 
messaggio ovviamente).
Esiste un modo semplice in JAVA per creare delle stringhe impostando i 
parametri come fossero delle PreparedStatements?
Per esempio, ipotizzando di avere le seguenti stringhe:
String requestLogin = "REQUEST LOGIN FOR ? WITH PASSWORD ?"
e
String requestFileinfo = "REQUEST FILEINFO FOR ?"
sarebbe comodo poter usare le seguenti istruzioni:
requestLogin.setParameter(1, 'pippo');
requestLogin.setParameter(2, 'topolino');
requestFileinfo.setParameter(1, 'conferenza.doc');
Ma soprattutto, sarebbe comodo avere delle funzioni che permettano al 
destinatario dei messaggi, di riconoscere automaticamente il messaggio 
ricevuto e soprattutto di estrarre i parametri.
Per esempio sarebbe comodo se il server potesse fare:
String msg = socket.receive();
if (msg.tipoMessaggio == RICHIESTA_LOGIN) { login(msg.Parametro(1), 
msg.Parametro(2)); }
else if (msg.tipoMessaggio == RICHIESTA_FILEINFO) { 
fileInfo(msg.Parametro(1)); }
E' possibile una cosa di questo tipo? Altrimenti cosa mi suggerite di fare 
per creare delle stringhe utilizzabili come messaggi da client e server e 
che siano:
- facilmente riconoscibili
- permettano di essere parsate facilmente per estrarre i parametri in esse 
contenuti
possibilmente senza andare ad ammattire con espressioni regolari o altre 
cose simili.
Grazie per l'aiuto
-- 
Elminster 

Ma http non ti piace?
"Elminster" <elminst...@QUESTOtiscali.it> ha scritto nel messaggio 
news:zE6ym.5504$Rt2...@tornado.fastwebnet.it...


 REQUEST LOGIN FOR pippo WITH PASSWORD pluto
il tuo pc parla inglese?
perche' altrimenti questo mi pare migliore (senza virgolette):
"login,pippo,password;" il ; da' la terminazione del messaggio,
potrebbe essere utile oppure no, dipende come parsi la stringa.
In generale i messaggi saranno della forma:
"comando,paramentro1,paramentro2,...;"
Come ti hanno gia' detto guarda i vari protocolli di comunicazione
gia' essitenti: http, ftp,... ti posso dare delle idee.
Inoltre non e' il massimo far passare le password in chiaro...
Ciao Jack

 Inoltre non e' il massimo far passare le password in chiaro
Per quello o si affida ad una cifratura che riguardi il canale di 
comunicazione (useremmo https in http) oppure un qualunque hash della 
password si vorr� trasmettere, se intercettato, sar� di per s� valevole come 
password. Ergo, criptare le password su un canale di comunicazione libero � 
inutile.

 dell'effettivo logout)
Trovato un bug al tuo protocollo. Se lanciassi un comando di logout, mi 
basterebbe indovinare un nome utente per rompere le scatole al sistema in 
qualche modo.
In situazioni del genere sono solito far ottenere un token all'utente al 
momento dell'autenticazione. Lo stesso token va chiesto al client per ogni 
azione che richieda autenticazione e per il logout. In questo modo � pi� 
difficile che qualche sconosciuto possa romperti le scatole.
Poi dovresti valutare anche se, per quello che devi fare, magari non sia 
meglio realizzare un servizio web, visto che il protocollo � stabile ed 
universale e devi solo concentrarti sulla realizzazione dell'interfaccia del 
sistema.

 parametri come fossero delle PreparedStatements?
http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html

 libero è inutile.
Usando un hash di password + numero di sequenza del messaggio, si 
otterrebbe una "one-time-password" non riutilizzabile. Si resterebbe 
pero' vulnerabili a injection, sniffing e ripetizione.
-- 
Enos

 "comando,paramentro1,paramentro2,...;"
Hai ragione, effettivamente � migliore soprattutto per le richieste semplici 
tipo la richiesta di login, la richiesta di logout, ecc.
Ma se il server deve mandare informazioni (nome, data e attributi) di cento 
file come posso fare?
Consigli sempre di mandare messaggi strutturati in quel modo?
O forse mi conviene passare all'XML?
-- 
Elminster 

 Ma http non ti piace?
Cosa intendi?
Come potrei mandare (utilizzando il protocollo HTTP) semplici richieste con 
uno o due parametri cos� come lunghissime risposte con centinaia di 
parametri?
E soprattutto, come farei a parsarle facilmente?
-- 
Elminster 

 comunicazione (useremmo https in http)
Il canale che uso � cifrato con SSL.
-- 
Elminster 

 E soprattutto, come farei a parsarle facilmente?
Dammi retta: crea un servizio web. Non dovrai sbatterti con problemi di 
parsing.

 sistema in qualche modo.
Avevo gi� pensato a questo problema ma visto che te ne sei interessato provo 
a dirti a quale soluzione avevo pensto cos� mi dici se secondo te va bene. 
Ogni client quando si connette viene servito da un thread appositamente 
creato per lui da parte del server.
1. l'utente si autentica e riceve il messaggio di autenticazione avvenuta
2. il server inserisce nella tabella utenti del database il numero 
identificativo (o una stringa identificativa) del thread corrente in modo 
che, a ogni successiva richiesta del client, possa verificare se quel thread 
(e quindi quel client) possa accedere alle informazioni richieste
3. quando l'utente effettua il logout, nella tabella utenti del DB viene 
svuotato il campo "authorized thread" corrispondente all'utente che si � 
sloggato
Ci sono bug evidenti che a me sfuggono?
-- 
Elminster 

 di parsing.
Purtroppo non posso: sto realizzando questa applicazione a fini didattici 
per l'universit� e una delle richieste � che tutto avvenga attraversa un 
client e un server progettati in JAVA in modo che, all'uscita 
dell'applicazione, possa eseguire una cancellazione sicura dei file 
temporanei eventualmente rimasti sul client.
-- 
Elminster 

 
http://java.sun.com/j2se/1.5.0/docs/api/java/text/MessageFormat.html
Sbaglio o la classe non � adatta al parsing di messaggi con un numero di 
parametri imprevedibile e sconosciuto a priori?
-- 
Elminster 

 O forse mi conviene passare all'XML?
oppure fai un ibrido, ad esempio puoi incapsulare l'xml
"comando,xml1,...;" un po' come fa l'SMTP per includere gli attachment
in una mail.
In Java c'e' la possibilita' di serializzare gli oggetti. Forse (non
ho mai provato) li puoi serializzare e poi mandare su un socket.
Ciao Jack

Il client di chiama browserWeb, il server application server (ad esempio 
TOMCAT tra i pi� elementari), il protocollo HTTP ci funziona tutto il web 
cos�.
Basta che impari a scrivere una servlet, le hanno inventate apposta per 
quello che devi fare tu...ma sa che devi studiare un p� di J2EE ....
Oppure usi RMI. Se invece l'esercizio ti richiede, a scopo di didattico, di 
reinventare l'acqua calda � tutta un'altra storia.
Ciao
"Elminster" <elminst...@QUESTOtiscali.it> ha scritto nel messaggio 
news:_Njym.6086$Rt2....@tornado.fastwebnet.it...
