English
Instant Developer Foundation Documentazione
  • Approfondimenti
  • Server Session

Esempio di Server Session

copia link

Introduzione

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.

event SeseChat.AfterLogin()
{
  // Se sono la server session
  if (SeseChat.sessionName() != "")
  {
    // Creo le liste
    SeseChat.OnlineUsers = new()
    SeseChat.AllMessages = new()
  }
  else
    ...
}
L'utente per accedere alla Chat dovrà inserire un Nickname nella pagina di login. Nell'evento di AfterLogin della sessione utente viene inviato un messaggio alla ServerSession, tramite il metodo SendSessionMessage, passando come parametro l'oggetto (documento) CurrentUser serializzato in xml. Questa è la modalità più corretta per comunicare interi oggetti alla ServerSession evitando problemi di multi threading.

event SeseChat.AfterLogin()
{
  // 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)
  }
}
La ServerSession gestisce il messaggio nell'evento OnSessionMessage ricostruendo l'oggetto User a partire dall'XML passato come primo parametro per poi aggiungerlo alla collection OnlineUsers.

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:
      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:
      ...
  }
}
Subito dopo il login si apre la videata docked OnLineUsers che mostra la lista degli utenti correntemente online. Questa videata ha un timer che ogni 5 secondi invia un messaggio alla ServerSession per ricevere eventuali aggiornamenti che riguardano l'utente loggato: la lista degli utenti correntemente collegati e i messaggi a lui destinati.

L'utente potrà iniziare a chattare con un'altro utente cliccando sul rispettivo nome nella lista.

Anteprima della chat utilizzata dall'utente Diego.
Dopo che aver scritto il messaggio premendo il bottone Invia viene inviato un messaggio alla ServerSession, tramite il metodo SendSessionMessage, passando come parametri l'identificativo dell'utente corrente, l'identificativo dell'utente a cui è destinato il messaggio e il testo del messaggio.

// **********************************
// 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(...)
}
La ServerSession gestisce il messaggio nell'evento OnSessionMessage creando un nuovo messaggio con i parametri forniti per poi aggiungerlo alla collection AllMessages.

// ****************************************************************************
// 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

Vedi anche

  • WEB: Server Session
  • After Login (evento)
  • Send Session Message (funzione)
  • On Session Message (evento)
  • Progetto SeseChat