Doriți să vă îmbogățiți aplicațiile web făcându-le în timp real - dar nu doriți să creați noi infrastructuri pentru singurul scop de a obține socket-uri web pentru a funcționa? În acest articol, vom explora modul de utilizare și implementare Pusher, un serviciu HTML5 WebSocket alimentat în timp real pentru aplicațiile dvs..
Conform paginii WebSocket Wikipedia, WebSocket este o tehnologie care oferă canale de comunicare bidirecționale, bidirecționale, pe o singură soclu TCP.
În termeni de layman, WebSockets permit unui client și unui server să comunice în ambele direcții. Permite unui server să trimită mesaje clientului și invers.
De-a lungul anilor, expirarea datelor a fost întotdeauna o problemă cu aplicațiile web, în special cu cele care au conectat mai multe persoane și care lucrează la aceleași lucruri. De exemplu, într-o aplicație de management de proiect, utilizatorii uneori creează articole de rezolvat pe care membrii echipei lor le creează în același timp. Cu WebSockets, acest lucru poate fi atenuat prin permiterea serverului Apăsați notificări către toate părțile conectate, permițând browserelor să primească date noi în timp real. De fapt, înainte de a crea un element duplicat de rezolvat, veți vedea că altcineva l-a creat deja.
Pusher este un API găzduit pentru adăugarea rapidă, ușoară și sigură a funcționalității scalabile în timp real prin WebSockets către aplicații web și mobile.
În esență, Pusher încorporează implementarea WebSockets, funcționalitatea, depanarea și găzduirea pentru dvs..
În loc să vă rulați propriul server WebSockets, vă permite să descărcați întregul proces pe serverele Pusher, economisind atât timp cât și bani.
Pusher este un API găzduit pentru adăugarea rapidă, ușoară și sigură a funcționalității scalabile în timp real prin WebSockets către aplicații web și mobile.
Pentru ca Pusher să funcționeze, veți avea nevoie atât de o bibliotecă de clienți, cât și de o bibliotecă de editori. Bibliotecile de clienți sunt utilizate împreună cu clientul care interfețează cu aplicația dvs. Acesta poate fi un browser (prin JavaScript), o aplicație iPhone (prin intermediul obiectivului C) sau o aplicație Flash (prin ActionScript). Bibliotecile de publicitate sunt utilizate pe serverul dvs. pentru a trimite evenimente clienților dvs..
În prezent, Pusher are biblioteci de clienți pentru JavaScript, Objective-C, ActionScript, .NET și Silverlight, Ruby și Arduino. Are biblioteci editor pentru Node.js, Java, Groovy, Grails, Clojure, Python, VB.NET, C #, PHP, Ruby, Perl și ColdFusion.
În scopul acestui tutorial, vom folosi biblioteca de client JavaScript și biblioteca editorului PHP. Implementarea nu ar trebui să fie prea diferită dacă utilizați un alt limbaj de programare.
Mă simt ca să construiesc un widget live chat, astfel încât oamenii să poată vorbi în timp real pe un site web. Având în vedere acest lucru, să continuăm.
Pentru a începe, mergeți la site-ul Pusher și înregistrați-vă pentru contul dvs. Acestea oferă un cont gratuit pentru utilizatorii planului Sandbox, care includ 20 de conexiuni și 100.000 mesaje pe zi. Când sunteți gata, puteți oricând să faceți upgrade la un plan plătit, dar din moment ce îl vom folosi doar pentru aplicația noastră de probă, un plan gratuit pentru Sandbox va face truc!
Pe site, faceți clic pe Inscrie-te pe care îl veți găsi în colțul din dreapta sus și introduceți detaliile necesare. După ce ați terminat, faceți clic pe Inscrie-te butonul din nou pentru a finaliza înregistrarea.
După ce vă înregistrați, veți fi redirecționat către dvs. Pagina Administrare Pusher. Aici puteți gestiona toate aplicațiile Pusher. Un singur cont poate găzdui mai multe aplicații.
În partea de sus, aveți bara de navigare, unde veți găsi următoarele secțiuni:
Acum sunteți gata să începeți să vă dezvoltați cu Pusher!
Să începem să dezvoltăm widget-ul live chat creând HTML. Ceea ce am în minte este un widget care va apărea în partea de jos a ecranului, cu un "Cine este online"? listă pe partea, ca IRC.
mesajele de chat merg aiciCine e online (0)
- utilizatorii online merg aici
Unele CSS-uri pentru stilul nostru HTML:
#chat_widget_container padding: 20px 20px 5px 20px; background-color: # F2F2F2; frontieră: 5px solid #AFAFAF; border-bottom: 0px; lățime: 333px; font-size: 11px; font-familie: "Lucida Grande", Arial, Helvetica, sans-serif; Poziția: fix; bottom: 0px; dreapta: 20px #chat_widget_login lățime: 333px; text-align: center; height: 166px; marginea superioară: 80px #chat_widget_main_container display: none #chat_widget_messages_container float: left; lățime: 200px; frontieră: 1px solid #DDD; height: 200px; overflow: auto; padding: 5px; culoare de fundal: #fff; poziție: relativă #chat_widget_messages overflow-x: hidden; overflow-y: auto; Poziția: absolută; fund: 0px #chat_widget_online width: 100px; height: 210px; plutește la stânga; padding: 0px 10px; frontieră: 1px solid #DDD; border-left: 0px; culoare de fundal: #fff; overflow: auto; #chat_widget_online_list style-list: none; umplutură: 0px #chat_widget_online_list> li margin-left: 0px #chat_widget_input_container margin-top: 10px; text-aliniere: stânga #chat_widget_input width: 260px; marja de-dreapta: 10px; frontieră: 1px solid #DDD; umplere: 2px 5px #chat_widget_loader display: none #chat_widget_login_loader display: none .clear clar: ambele
HTML-ul și CSS-ul combinat de mai sus ar trebui să facă ceva în paralel cu:
Va trebui să creăm o funcție care să declanșeze când dăm clic pe Logare butonul și verifică valoarea introdusă, deci hai să facem asta:
$ ('# chat_widget_login_button') click (functie () $ (this) .hide (); // ascunde butonul de login $ ('# chat_widget_login_loader'). (/ username = username.replace (/ [^ a-z0-9] / gi, "); // filtrați dacă (username ==") / username = / if blank, apoi alertați alerta utilizatorului ('Vă rugăm să furnizați un nume de utilizator valid (numai alfanumeric)'); altfel // altceva, conectați utilizatorul nostru prin start_session.php ajaxCall ('start_session.php', username: username , function () // Suntem logati! Acum ce?););
Apoi, trebuie să informăm serverul când ne-am conectat. Pentru a face acest lucru, vom crea un server start_session.php fișier care va fi, în esență, conectat la utilizator.
Adevărat)); Ieșire(); ?>
Veți observa că am creat un ajaxCall funcția, care în principiu doar înfășoară în jurul funcției jQuery $ .ajax. Doar adăugați acest lucru înaintea liniei $ (document) .ready ().
funcția ajaxCall (ajax_url, ajax_data, successCallback) $ .ajax (tip: "POST", url: ajax_url, dataType: "json", data: ajax_data, time: 10; succes) successCallback (msg); altul alert (msg.errormsg);, eroare: funcție (msg) );
Acum, să încărcăm biblioteca JavaScript Pusher și jQuery, de asemenea. Plasați următoarele referințe de script în cadrul
din HTML:Amintiți-vă Acces API Pagina de mai sus? Reveniți la acesta și notați-vă acreditările API. Vom avea nevoie de aceste valori atunci când vom configura bibliotecile clienților și editorilor.
Simțiți-vă liber să folosiți a mea, cu toate acestea, vă recomandăm să obțineți propriul dvs., deoarece un cont gratuit este limitat și s-ar putea să fiți tăiat în mijlocul.
Înainte de a începe implementarea aplicației Pusher în aplicația noastră, trebuie să înțelegem niște termeni Pusher:
Există trei tipuri de canale:
Canalele de prezență sunt speciale, deoarece ne permit să trimitem informații despre utilizatori atunci când se conectează. De asemenea, au evenimente speciale la care ne putem abona pentru a afla când un utilizator se conectează și se deconectează. Canalele de prezență sunt ideale pentru canalele private, care trebuie să știe când un utilizator intră sau iese.
Să începem prin conectarea clientului nostru la serviciul Pusher. Pentru a face acest lucru, va trebui să creați o nouă instanță a obiectului Pusher (din bibliotecă) și să apelați Abonati-va funcţie. Adăugați următorul cod după // Suntem logați! Acum ce?
cometariu.
Abonati-va în mod esențial, clientul se alătură canalului. După intrarea în canal, clientul va putea să primească evenimente care se petrec în interiorul acestuia.
pushher = Pusher nou ('12c4f4771a7f75100398'); // APP KEY: Pusher.channel_auth_endpoint = 'pusher_auth.php'; // suprascrie channel_auth_endpoint nettuts_channel = pushher.subscribe ('presence-nettuts'); // se alăture canalului prezență nettuts
Când vă abonați la a prezenţă sau privat , trebuie să ne asigurăm că utilizatorul conectat are permisiunea de a accesa canalul. Prin urmare, înainte de a permite clientului să se conecteze complet la acesta, clientul Pusher efectuează automat un apel la adresa URL definită în channel_auth_endpoint variabile și le trimite informații despre conectarea utilizatorului. Apoi, prin channel_auth_endpoint, ne putem da seama dacă utilizatorul conectat este autorizat.
Implicit, se face acest apel / Împingător / auth, dar îl putem ignora prin setarea channel_auth_endpoint variabil.
Unic
socket_id
este generat și trimis la browser de către Pusher. Atunci când se încearcă să se aboneze un canal privat sau de prezențăsocket_id
șinumele canalului
este trimis la cererea dvs., (1) printr-o cerere AJAX POST care autorizează utilizatorul să acceseze canalul împotriva sistemului de autentificare existent. În cazul în care aplicația dvs. de succes returnează un șir de autorizație browserului conectat cu secretul Pusher. Acesta este trimis către Pusher prin WebSocket, care completează autorizația (2) dacă se potrivește șirul de autorizare.
Revenind la cererea noastră, trebuie să ne creăm channel_auth_endpoint. Creați un fișier, numit pusher_auth.php și plasați acest lucru în interior:
* / $ pusher = Pusher nou ('12c4f4771a7f75100398', / / APP KEY '51399f661b4e0ff15af6 (*) ', // APP SECRET' 8896 '// APP ID); // Toate datele pe care doriți să le trimiteți despre persoana care subscrie $ presence_data = array (' username '=> $ _SESSION [' username ']); pusher-> presence_auth ($ CHANNEL_NAME, // numele canalului utilizatorul este abonarea la $ socket_id, // priza id-ul primit de la biblioteca client $ _SESSION împingător [ „userid“], // codul unic de utilizator, care identifică userul $ presence_data // datele despre persoana respectivă; exit ();?>
Acum, că putem autentifica utilizatorii conectați, va trebui să legăm câteva funcții JavaScript în evenimentele Pusher pentru a arăta că am fost deja conectat. Actualizați codul de mai jos // Suntem logați! Acum ce?
comentariu, cum ar fi:
// Suntem logați! Acum ce? pushher = Pusher nou ('12c4f4771a7f75100398'); // APP KEY: Pusher.channel_auth_endpoint = 'pusher_auth.php'; // suprascrie channel_auth_endpoint nettuts_channel = pushher.subscribe ('presence-nettuts'); // se alăture-prezență nettuts canal pusher.connection.bind ( 'conectat', funcția () // leagă o funcție după ce am conectat la împingător $ ( '# chat_widget_login_loader') ascunde ();. // ascunde ()) (* # chat_widget_login_button ') arată (); // arătați butonul de login din nou $ (' # chat_widget_login '). ; // afișați ecranul de chat // aici, legăm la împingătorul: eveniment subscription_succeeded, care se numește de fiecare dată când // subscrie cu succes la un canal nettuts_channel.bind ('pusher: subscription_succeeded', funcția (members) // this face o listă a tuturor clienților online și stabilește lista online html // actualizează, de asemenea, numărul online var whosonline_html = "; members.each (function (member) whosonline_html + = '
Nu uitați să adăugați updateOnlineCount (); funcția de mai sus $ (Document) .ready ()
linia:
funcția updateOnlineCount () $ ('# chat_widget_counter'). html ($ ('. chat_widget_member').
pusher.connection.bind ne permite să legăm o funcție de apel invers ori de câte ori se schimbă starea conexiunii Pusher. Există multe stări posibile, cum ar fi inițializat, conectat, indisponibil, eșuat și deconectat. Nu le vom folosi în acest tutorial, dar puteți citi mai multe despre ele în documentația Pusher.
channel_name.bind ne permite să legăm o funcție de un anumit eveniment care s-ar putea întâmpla în interiorul canalului. În mod implicit, canalele de prezență au evenimente proprii pe care le putem lega funcții, cum ar fi împingător: subscription_succeeded eveniment pe care l-am folosit mai sus. Puteți citi mai multe despre ele în documentația Evenimente pentru clienți.
Hai să examinăm aplicația acum și să vedem ce se întâmplă. Pentru aceasta, deschideți două file ale aplicației și conectați-vă de două ori. Ar trebui să vedeți ceva de genul:
Când închideți o filă, al doilea client se închide, declanșându-ne împingător: member_removed eveniment și eliminarea clientului din lista online:
Acum că funcționează, putem pune în aplicare în cele din urmă funcționalitatea de bază a aplicației noastre - chat live.
Să începem prin obligarea unei funcții la evenimentul de prezentare al formularului de chat:
$ ('# chat_widget_form'), trimiteți (funcția () var chat_widget_input = $ ('chat_widget_input'), chat_widget_button = $ ('chat_widget_button'), chat_widget_loader = $ (); // a obține valoarea din introducerea textului chat_widget_button.hide (); // ascundeți butonul de chat chat_widget_loader.show (); // afișați încărcătorul de chat gif ajaxCall ('send_message.php', message: message , funcția (msg) // efectuați un apel ajax la send_message.php chat_widget_input.val ("); // ștergeți intrarea textului chat_widget_loader.hide (); // ascundeți încărcătorul gif chat_widget_button.show (); // show butonul de chat newMessageCallback (msg.data); // afișați mesajul cu funcția newMessageCallback); return false;);
newMessageCallback funcţie:
Funcția newMessageCallback (date) if (has_chat == false) // daca utilizatorul nu are mesaje de chat în div încă $ ( '# chat_widget_messages') html ( ");. // elimina conținutul respectiv„chat- Mesajele intră aici 'has_chat = true; // și setați-o astfel încât să nu intre în interiorul acestei declarații if-again $ (' # chat_widget_messages ') append (data.message +
„);
După aceea, va trebui să creăm send_message.php pentru a primi apelul nostru AJAX de sus și a declanșa mesaj nou eveniment:
<$_SESSION['username']> $ message; // declanșează evenimentul 'new_message' din canalul nostru, 'trigger-ul net-urilor de prezență-nettuts' ('presence-nettuts', // canalul 'new_message' mesajul '=> $ message) // datele de trimis); // echo matricea de succes pentru ajax call echo json_encode (array (' message '=> $ message,' succes '=> true) ;
Probabil vă întrebați de ce am abstracționat newMessageCallback
în propria sa funcție. Ei bine, va trebui să o sunăm din nou când primim a mesaj nou eveniment de la Pusher. Următorul cod leagă o funcție pentru un eveniment numit mesaj nou, care va declanșa de fiecare dată când un utilizator trimite un mesaj. Adăugați acest cod după nettuts_channel.bind ( 'împingător: member_removed')
cod bloc:
nettuts_channel.bind ('new_message', funcția (data) newMessageCallback (data););
date
variabila în funcția de legare deasupra va fi datele pe care le trimite serverul $ Pusher-> trigger ()
apel, care ar trebui să conțină datele mesajului.
Hai să încercăm din nou aplicația noastră două browsere
, nu tab-uri. (Sau încercați cu un prieten dacă l-ați încărcat undeva.)
Felicitări! Ați creat cu succes o aplicație de lucru utilizând Pusher.
Acolo îl aveți, un lucru timp real aplicație alimentată de Pusher. Simțiți-vă liber să vizitați demo-ul live chat pe care l-am înființat aici.
Există mult mai multe lucruri pe care nu le-am discutat în acest tutorial, cum ar fi depanarea aplicațiilor, excluderea destinatarilor din evenimente și declanșarea evenimentelor de pe partea clientului, dar le puteți învăța pur și simplu prin citirea documentației Pusher. Puteți chiar să verificați prezentarea lor de site-uri web și de aplicații care utilizează Pusher pentru a lucra în timp real.
Acest tutorial doar zgârie suprafața Pusher și WebSockets în general. Cu acest tip de tehnologie, ceea ce puteți face este limitat doar de ceea ce vă puteți imagina construirea.
Ați încercat să creați ceva cu Pusher sau intenționați să faceți acest lucru în curând? Anunță-mă în comentariile!
Notă: Aplicatorul a cerut să resetați acreditările API utilizate de contul demo în acest tutorial, ca măsură de precauție pentru abuzarea acestuia. Îmi cer scuze pentru voi băieți și, sperăm, puteți obține doar dvs. :) Multumesc!