Start Using HTML5 WebSockets Today
Start Using HTML5 WebSockets Today
One of the coolest new features of HTML5 is WebSockets, which let us talk to the server without using AJAX requests. In this tutorial, well review the process of running a WebSocket server in PHP, and then building a client to send and receive messages to it over the WebSocket protocol.
made some changes to it and will including it in the source files) There are various WebSocket implementations; if one doesnt work, you can try another or just continue with the tutorial.
9. } 10. #chatLog{ 11. padding:5px; 12. border:1px solid black; 13. } 14. #chatLog p { 15. margin:0; 16. } 17. .event { 18. color:#999; 19. } 20. .warning{ 21. font-weight:bold; 22. color:#CCC; 23. }
The Events
Well be using three events:
onopen: When a socket has opened onmessage: When a message has been received
But how can we implement this? First create a WebSocket object view plaincopy to clipboardprint? 1. var socket = new WebSocket("ws://localhost:8000/socket/server/startDaemon.php"); And checking for events is as simple as: view plaincopy to clipboardprint? 1. socket.onopen = function(){ 2. alert("Socket has been opened!"); 3. } But what about when we receive a message? view plaincopy to clipboardprint? 1. socket.onmessage = function(msg){ 2. alert(msg); //Awesome! 3. } However, lets avoid using alert boxes, and actually integrate what weve learned into the client page.
Step 6: JavaScript
Ok, so lets get started. First we put our code in jQuerys document ready function, then we check whether the user has a WebSockets-enabled browser. If they do not, we append a link to Chrome in the HTML. view plaincopy to clipboardprint? 1. $(document).ready(function() { 2. if(!("WebSocket" in window)){ 3. $('#chatLog, input, button, #examples').fadeOut("fast"); 4. $('<p>Oh no, you need a browser that supports WebSockets. How about <a href="ht tp://www.google.com/chrome">Google Chrome</a>?</p>').appendTo('#container'); 5. }else{ 6. //The user has WebSockets
7. connect(); 8. function connect(){ 9. //the connect function code is below 10. } 11. }); As you can see, if the user has WebSockets then we call a connect() function. This is the core of the functionality: well start with the open, close and receive events. Well define the URL of our server view plaincopy to clipboardprint? 1. var socket; 2. var host = "ws://localhost:8000/socket/server/startDaemon.php"; Wait, wheres the http in that URL? Oh right, its a WebSocket URL, so its using a different protocol. Heres a breakdown of the pieces of our URL:
Lets continue with our connect() function. We will put our code within a try/catch block; so if something goes wrong, we can let the user know. We create a new WebSocket, and pass the message to a message function which Ill explain later. We create our onopen, onmessage and onclose functions. Note that we also show the user the socket status; this is not necessary, but Im including it here as it can be helpful for debugging.
view plaincopy to clipboardprint? 1. function connect(){ 2. try{ 3. var socket; 4. var host = "ws://localhost:8000/socket/server/startDaemon.php"; 5. var socket = new WebSocket(host); 6. message('<p class="event">Socket Status: '+socket.readyState);
7. socket.onopen = function(){ 8. message('<p class="event">Socket Status: '+socket.readyState+' (open)'); 9. } 10. socket.onmessage = function(msg){ 11. message('<p class="message">Received: '+msg.data); 12. } 13. socket.onclose = function(){ 14. message('<p class="event">Socket Status: '+socket.readyState+' (Closed)'); 15. } 16. } catch(exception){ 17. message('<p>Error'+exception); 18. } 19. } The message() function is fairly simple, it takes in some text that we want to show the user and appends it to the chatLog. We create the appropriate class for paragraph tags in the socket event functions which is why there is only one closing paragraph tag in the message function. view plaincopy to clipboardprint? 1. function message(msg){ 2. $('#chatLog').append(msg+'</p>'); 3. }
So Far
If youve been following up to this point, well done! Weve managed to create a basic HTML/CSS template, create and establish a WebSocket connection and keep the user updated as progress was made with the connection.
24. message('<p>Error'+exception); 25. } 26. function send(){ 27. var text = $('#text').val(); 28. if(text==""){ 29. message('<p class="warning">Please enter a message'); 30. return ; 31. } 32. try{ 33. socket.send(text); 34. message('<p class="event">Sent: '+text) 35. } catch(exception){ 36. message('<p class="warning">'); 37. } 38. $('#text').val(""); 39. } 40. function message(msg){ 41. $('#chatLog').append(msg+'</p>'); 42. } 43. $('#text').keypress(function(event) { 44. if (event.keyCode == '13') { 45. send(); 46. } 47. }); 48. $('#disconnect').click(function(){ 49. socket.close(); 50. }); 51. }//End connect 52. }//End else 53. });
Finished
When the page loads, a WebSocket connection will attempt to be established (try editing the code so the user has connect/disconnect option). Then, the user can enter messages and receive messages from the server.
Thats it!
Thanks for reading; I hope you enjoyed this tutorial! Remember, as exciting as WebSockets may be, things may change. You can refer here to keep up to date on the W3C WebSocket API.