{"id":209,"date":"2011-12-12T19:20:14","date_gmt":"2011-12-12T18:20:14","guid":{"rendered":"http:\/\/localhost\/blog\/?p=209"},"modified":"2021-05-29T12:39:22","modified_gmt":"2021-05-29T10:39:22","slug":"jqueryajax-in-azione-una-chat-completa","status":"publish","type":"post","link":"https:\/\/www.ilbytecidio.it\/?p=209","title":{"rendered":"JQuery\/Ajax in azione: una chat completa!"},"content":{"rendered":"<p>Per consolidare le mie conoscenze ho deciso di sviluppare un esempio completo di pagina Web dinamica (diciamo pure applicazione Web) sviluppata grazie alla comodit\u00e0 offerta da JQuery. Inizialmente doveva essere un semplice esempio come gli altri che vi ho mostrato, ma poi mi sono lasciato prendere la mano e ho sviluppato una chat completa, che ho pure testato con gli amici (grazie in particolare a Koryu, BigSmurf, iskyz e Nickos88 nonch\u00e9 a mia sorella)! <!--more--><br \/>\nCi sono un sacco di altre cose che avrei potuto aggiungere, ma un programmatore deve sapere quando fermarsi! Potete usarla sia come esempio didattico che nei vostri siti Web, se lo desiderate. Naturalmente occorrer\u00e0 abbellirla in qualche maniera. JQuery UI potrebbe essere una buona idea, ma se siete pi\u00f9 creativi di me potete anche giocare col foglio di stile e farci qualcosa di bello. Il Web design non \u00e8 il mio campo e comunque esulava dai miei scopi.<br \/>\nChi come me ha a che fare col Web da tanto noter\u00e0 come finalmente la tecnologia ci consenta di avere una chat che sia del tutto &#8220;nostra&#8221;. Prima servivano dei server Java o degli orribili frame che facessero continui refresh. Spesso ci si affidava a servizi che consentivano di inserire una chat pronta sul sito, senza alcuna integrazione.<\/p>\n<p>Veniamo a noi. La chat \u00e8 composta principalmente dai seguenti file:<\/p>\n<ol>\n<li><strong>chat_server.php<\/strong><br \/>\n\u00e8 la parte lato-server della chat. Si occupa di gestire lo scambio di messaggi, quindi di memorizzarli e spedirli ai client quando li richiedono. Include ovviamente le funzioni di login\/logout, consente di leggere alcuni parametri di configurazione della chat e di ricevere la lista degli utenti connessi. Il formato utilizzato per codificare i dati \u00e8 JSON, di cui <a title=\"Trasferimento di dati con JQuery e JSON\" href=\"http:\/\/www.ilbytecidio.it\/?p=217\">abbiamo gi\u00e0 parlato<\/a>. Le operazioni svolte dal server sono assolutamente minimali, in pieno spirito Cloud Computing, dato che della presentazione e di eventuali elaborazioni secondarie si occuperanno i client, ormai dotati di potenza sufficiente a cavarsela da soli! Le uniche operazioni non necessarie che ci concediamo di lasciare sul server sono gli ordinamenti, sia perch\u00e9 possiamo farlo con molto meno codice, sia perch\u00e9 ci aspettiamo che gli algoritmi utilizzati da un DBMS siano pi\u00f9 efficienti dei nostri. E poi \u00e8 improbabile che la lista utenti serva in ordine diverso da quello alfabetico, tanto vale evitare di aggiungere codice ridondante!<br \/>\nL&#8217;accesso alle funzioni avviene attraverso semplici richieste HTTP. In pratica si accede alla pagina passando opportuni parametri, cos\u00ec come avviene per un normale sito Web.<br \/>\nQuesta pagina si pu\u00f2 quasi definire un Web Service, dal momento che possiamo accedervi e usarne le funzioni da qualsiasi dispositivo e non solo attraverso le pagine lato client che ho creato io. Un&#8217;applicazione per smartphone per esempio potrebbe collegarsi alla chat attraverso questa pagina, senza l&#8217;obbligo di usare un browser. Tutto ci\u00f2 che gli serve \u00e8 la capacit\u00e0 di fare richieste HTTP e interpretare i dati JSON.<\/li>\n<li><strong>chat_class.js<\/strong><br \/>\nQuesta classe permette di avere un&#8217;interfaccia ben definita che rappresenta sul client le chiamate che possiamo eseguire al server. In pratica nasconde tutti i dettagli sulle chiamate AJAX, sui formati dei parametri ecc. Dato che le chiamate AJAX sono tutte asincrone, vengono lanciati degli eventi nel momento in cui le operazioni richieste sono compiute e all&#8217;evento \u00e8 associata la risposta del server. L&#8217;utilizzatore di questa classe pu\u00f2 associare a tali eventi l&#8217;azione da intraprendere (per esempio avvisare l&#8217;utente che il login \u00e8 avvenuto correttamente). In aggiunta, la classe include i campi nick e user_id che sono impostati automaticamente al momento della connessione, cos\u00ec possiamo averli sottomano. \u00c8 possibile una maggiore astrazione facendo s\u00ec che questa classe o eventualmente un&#8217;altra che ne faccia uso rappresenti la chat in tutto e per tutto, ma secondo me va gi\u00e0 bene cos\u00ec, senza aggiungere ulteriore &#8220;peso&#8221;!<\/li>\n<li><strong>index.html<\/strong><br \/>\nQuesta \u00e8 la pagina a cui ci si pu\u00f2 collegare per utilizzare la chat.<br \/>\nVengono utilizzati i metodi della classe chat per comunicare col server e agli eventi generati sono associate le opportune azioni. Al momento della connessione viene generato un cookie che consente di conservare l&#8217;ID di sessione, in modo che in caso di chiusura o refresh accidentale della pagina, si mantenga la connessione.<\/li>\n<\/ol>\n<p>A proposito della sessione, \u00e8 bene aggiungere una piccola nota di sicurezza: non \u00e8 verificato in alcun modo che l&#8217;ID di sessione scelto ci appartenga, quindi in linea di massima \u00e8 possibile che un altro utente scriva al posto nostro, ma \u00e8 molto improbabile che a un malintenzionato interessi rubarci un nick su una chat che non richiede alcuna registrazione! Proprio per evitare altri generi di &#8220;rogne&#8221;, non viene utilizzata la sessione PHP ma gli ID vengono generati casualmente dal server al momento del login.<br \/>\nAi file elencati si aggiunge un piccolo file di configurazione con qualche parametro da impostare prima dell&#8217;utilizzo.<br \/>\nHo scelto di utilizzare un database perch\u00e9 lavorare con dei file avrebbe complicato ulteriormente le cose, ma si pu\u00f2 sempre modificare la pagina server e farla funzionare in modo diverso. Se siete interessati a una chat gi\u00e0 pronta basata su file potete <a href=\"http:\/\/css-tricks.com\/4371-jquery-php-chat\/\">seguire questo link<\/a><\/p>\n<p>\u00c8 interessante discutere una scelta fatta su un dettaglio della chat. Come potrete vedere, vi \u00e8 la possibilit\u00e0 di ignorare uno o pi\u00f9 utenti. Questa caratteristica \u00e8 aggiunta lato-client, il server non ne sa nulla: semplicemente gli utenti da ignorare sono tenuti in memoria e i loro messaggi non vengono scritti sulla finestra della chat. I vantaggi sono ovvi: il server \u00e8 mantenuto minimale, non si complica la gestione degli utenti, le query sono pi\u00f9 leggere. Il primo svantaggio \u00e8 che se aggiorniamo la pagina perdiamo gli utenti ignorati. La cosa si risolve facilmente con un cookie, ma come ho gi\u00e0 detto prima, mi sono fermato prima di ingarbugliare ancora il codice.. divertitevi voi ad aggiungerlo! Pi\u00f9 serio pu\u00f2 essere il fatto che se un utente si disconnette e un altro si connette con lo stesso nick prima del refresh della lista, ignoreremo un innocente&#8230; ma diciamo la verit\u00e0, quanto \u00e8 probabile questa cosa? Infine, abbiamo dei trasferimenti di dati inutili, problema che potrebbe essere piuttosto serio se ignorassimo molti utenti che scrivono messaggi-spam molto grandi, ma abbiamo la possibilit\u00e0 di impostare un intervallo di flood. Di default questo intervallo \u00e8 1 secondo e l&#8217;intervallo di scaricamento dei messaggi \u00e8 di 3 secondi. Se immaginiamo di ignorare 2 utenti che scrivono un messaggio al secondo, al massimo scaricheremo 6 messaggi inutili. Per evitare che questo sia troppo costoso, potrebbe essere una buona idea controllare la lunghezza dei messaggi entranti sul server e restituire un codice di errore se si supera un certo numero di caratteri. Comunque non lasciamoci suggestionare: abbiamo linee piuttosto veloci, non sar\u00e0 qualche kb (esagerando) in pi\u00f9 di messaggi a guastarci il divertimento. Possiamo usare la chat cos\u00ec e prendere eventuali contromisure se si presentano problemi \ud83d\ude42<\/p>\n<p>Non mi dilungo in altre spiegazioni. I file sono ricchi di commenti!<\/p>\n<p>Veniamo all&#8217;installazione. Vi occorre un database MySQL e PHP (io ho la versione 5.3.8, ma dovrebbe funzionare anche con versioni precedenti, purch\u00e9 non pi\u00f9 vecchie della 5.2). Per prima cosa dovete creare un database ed importare le tabelle dal file chat.sql, poi aprite il file chat_configuration.php e impostate i parametri di connessione al database stesso. Per verificare che tutto funzioni correttamente aprite col vostro browser la pagina chat_server.php. con i seguenti parametri:<code><\/code><\/p>\n<blockquote><p><code>http:\/\/VOSTRO_PATH\/chat_server.php?action=verify_connection&amp;session=0<\/code><\/p><\/blockquote>\n<p>Se ci\u00f2 che visualizzate \u00e8 {&#8220;code&#8221;:3}, tutto funziona correttamente. Se non visualizzate nulla controllate di aver impostato i parametri giusti e creato bene il database.<br \/>\nPotrete accedere alla chat attraverso index.html.<br \/>\nI pi\u00f9 smaliziati potranno includere la chat nel proprio sito come vorranno (so che le chat non vanno di moda come una volta, ma fa sempre piacere averne una).<br \/>\nLa licenza \u00e8 la BeerWare, quindi potrete farci ci\u00f2 che vorrete \ud83d\ude00<br \/>\nSe qualche internauta capitasse qui, la scaricasse e la utilizzasse, mi farebbe piacere che mi scrivesse due righe di impressioni (qui o in privato) e magari il link della propria pagina.<\/p>\n<p>Ecco il link: <a href=\"http:\/\/www.ilbytecidio.it\/altri_file\/chat1.0.zip\">altri_file\/chat1.0.zip<\/a><br \/>\nHappy Hacking!<\/p>\n<p><strong>AGGIORNAMENTI:<\/strong><br \/>\n29\/05\/2021: Aggiunto jquery-cookie nel file zip, sostituite le chiamate mysql con mysqli <a href=\"http:\/\/www.ilbytecidio.it\/altri_file\/chat1.1.zip\">altri_file\/chat1.1.zip<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Per consolidare le mie conoscenze ho deciso di sviluppare un esempio completo di pagina Web dinamica (diciamo pure applicazione Web) sviluppata grazie alla comodit\u00e0 offerta da JQuery. Inizialmente doveva essere un semplice esempio come gli altri che vi ho mostrato, &hellip; <a href=\"https:\/\/www.ilbytecidio.it\/?p=209\">Continua a leggere<span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,20,22,19],"tags":[],"class_list":["post-209","post","type-post","status-publish","format-standard","hentry","category-programmazione-htmlcss","category-programmazione-javascript","category-programmazione-php","category-programmazione-web"],"views":907,"_links":{"self":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/209","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=209"}],"version-history":[{"count":6,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/209\/revisions"}],"predecessor-version":[{"id":1042,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=\/wp\/v2\/posts\/209\/revisions\/1042"}],"wp:attachment":[{"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=209"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ilbytecidio.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}