Esempio di Server Session
copia linkIntroduzione
In questo articolo si vuole mostrare un esempio pratico di utilizzo delle ServerSession, funzionalità introdotta nella versione 9.5.
Le ServerSession nascono per facilitare la condivisione di informazioni tra le sessioni utenti e per poter "lanciare" in maniera controllata delle operazioni lato server senza bloccare l'utente.
In questo esempio useremo le ServerSession per realizzare una Chat tra più utenti: in fondo all'articolo è possibile scaricare il SeseChat per provare l'applicazione.
Come funziona
In una chat sono coinvolti due tipi di interlocutori: il Chat Manager gestito tramite ServerSession e gli utenti interessati a scambiarsi messaggi. Nel diagramma sottostante viene mostrata la struttura dell'applicazione.

Come si implementa
Ora vediamo come si può implementare una Chat utilizzando le ServerSession.
Innanzitutto l'applicazione deve avere attivo il flag "Avvia Server Session" per fare in modo che appena il Web Server fa partire l'applicazione venga avviata una ServerSession con il nome dell'applicazione, in questo caso "Sese Chat". Al suo avvio la ServerSession inizializzerà due collection: OnlineUsers e AllMessages che conterranno rispettivamente l'elenco degli utenti correntemente collegati e la lista dei messaggi scambiati tra gli utenti. Dopo il suo avvio la ServerSession rimane in attesa di messaggi da parte degli utenti.
{
// Se sono la server session
if (SeseChat.sessionName() != "")
{
// Creo le liste
SeseChat.OnlineUsers = new()
SeseChat.AllMessages = new()
}
else
...
}
{
// Se sono la server session
if (SeseChat.sessionName() != "")
...
else
{
// Memorizzo i miei dati
SeseChat.CurrentUser = new()
SeseChat.CurrentUser.ID = toInteger(random(...) * 1000000)
SeseChat.CurrentUser.Name = SeseChat.userName
SeseChat.CurrentUser.setOriginal()
//
// Aggiorno la caption
SeseChat.mainCaption = formatMessage("Utente |1 (ID: |2)", SeseChat.
CurrentUser.Name, SeseChat.CurrentUser.ID, ...)
//
// Avviso che sono online
IDArray args = new()
args.addValue(SeseChat.CurrentUser.saveToXML(false, ...))
SeseChat.sendSessionMessage("Sese Chat", NewUser, 0, args)
//
// Apro la lista degli utenti
OnLineUsers.show(...)
OnLineUsers.RefreshList()
//
// Mostro il messaggio introduttivo
SeseChat.showTooltip("Benvenuto in SeseChat!!!\n\nSe vedi utenti online
sulla destra clicca sul nome per chattare con lui.", "Benvenuto!", ...
, false)
}
}
string NomeSessione // Nome della sessione che ha inviato il messaggio
string Messaggio // Testo del messaggio
IDArray Parametri // Parametri del messaggio
inout string Risultato // Parametro di output in cui scrivere il risulta...
)
{
switch (Messaggio)
{
case NewUser:
User newUser = new()
newUser.loadFromXML(Parametri.getValue(0), false)
//
// Aggiungo l'utente alla lista degli utenti online se non c'é già
if (SeseChat.OnlineUsers.findDocument(newUser) == 0)
SeseChat.OnlineUsers.add(newUser)
break
case UsersList:
...
case LogoffUser:
...
case NewMessage:
...
}
}
L'utente potrà iniziare a chattare con un'altro utente cliccando sul rispettivo nome nella lista.

Anteprima della chat utilizzata dall'utente Diego.
// Invia il messaggio al destinatario
// **********************************
public void ChatWindow.Invia()
{
IDArray args = new()
args.addValue(SeseChat.CurrentUser.ID)
args.addValue(this.WithUser.ID)
args.addValue(NewMessage.Text)
//
// Cerco di inviare il messaggio
if (SeseChat.sendSessionMessage("Sese Chat", NewMessage, 0, args) ==
toString(true))
NewMessage.Text = null
//
// Rinfresco
OnLineUsers.RefreshList()
//
// Rido il fuoco all'input
NewMessage.Text.setFocus(...)
}
// Evento notificato all'applicazione quando viene inviato un messaggio alla
// sessione
// ****************************************************************************
event SeseChat.OnSessionMessage(
string NomeSessione // Nome della sessione che ha inviato il messaggio
string Messaggio // Testo del messaggio
IDArray Parametri // Parametri del messaggio
inout string Risultato // Parametro di output in cui scrivere il risulta...
)
{
switch (Messaggio)
{
case NewUser:
...
case UsersList:
...
case LogoffUser:
...
case NewMessage:
Message m = new() // Creo il nuovo messaggio
//
// Imposto le proprietà con i parametri forniti
m.ID = SeseChat.AllMessages.count() + 1
m.CreationTime = now()
m.SrcUserID = Parametri.getValue(0)
m.DstUserID = Parametri.getValue(1)
m.Message = Parametri.getValue(2)
m.setOriginal()
//
// Lo aggiungo alla lista dei messaggi
SeseChat.AllMessages.add(m)
//
// Rispondo con esito positivo
Risultato = toString(true)
break
}
}
Ultima modifica: 17/11/2022 / Validità: da 9.5.4160