{"id":23,"date":"2010-05-03T22:16:40","date_gmt":"2010-05-04T04:16:40","guid":{"rendered":"http:\/\/timothypoon.com\/blog\/?p=23"},"modified":"2010-05-05T11:48:33","modified_gmt":"2010-05-05T17:48:33","slug":"using-websockets-with-php","status":"publish","type":"post","link":"https:\/\/timothypoon.com\/blog\/2010\/05\/03\/using-websockets-with-php\/","title":{"rendered":"Using WebSockets With PHP"},"content":{"rendered":"<p><a href=\"http:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2010\/05\/EngineBuild3.jpg\"><img decoding=\"async\" src=\"http:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2010\/05\/EngineBuild3.jpg\" alt=\"Mega Hovertank Wars\" title=\"Mega Hovertank Wars\" width=\"100%\" class=\"aligncenter size-full wp-image-29\" srcset=\"https:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2010\/05\/EngineBuild3.jpg 650w, https:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2010\/05\/EngineBuild3-300x225.jpg 300w\" sizes=\"(max-width: 650px) 100vw, 650px\" \/><\/a><\/p>\n<p>For my senior design project class, my group decided to try our hand at making a multiplayer 3D tank shooter game (called Mega Hovertank Wars) that plays in an <a href=\"http:\/\/dev.w3.org\/html5\/spec\/Overview.html\" title=\"HTML5\">HTML5<\/a>-compliant browser. Along with one other team member (the other two were pretty much dead weight), we worked heartily on the game engine, but it turns out he didn&#8217;t have much experience with programming in anything except JavaScript. Obviously, that won&#8217;t cut it for writing a game server.<\/p>\n<p>Luckily, I have a hefty amount of experience with PHP, and we were really set on writing our code so that it could run on just about any server or web hosting plan out there, otherwise I probably would have taken a C++ or Java approach.<\/p>\n<p>My original plan was to use long-polling with <a href=\"http:\/\/en.wikipedia.org\/wiki\/Ajax_(programming)\" title=\"Ajax (programming) - Wikipedia, the free encyclopedia\">AJAX<\/a> since most other <a href=\"http:\/\/en.wikipedia.org\/wiki\/Comet_(programming)\" title=\"Comet (programming) - Wikipedia, the free encyclopedia\">Comet<\/a> implementations required packages to be installed on the server that usually weren&#8217;t allowed on most web hosting plans. However, through a combination of finding this to be too slow for effective gameplay and discovering that Chrome had <a href=\"http:\/\/dev.w3.org\/html5\/websockets\/\" title=\"The WebSocket API\">websocket<\/a> support, I decided to change over to using sockets, though sticking with PHP (just because I like it).<\/p>\n<h2>Client Side<\/h2>\n<p>Unfortunately, it turns out that since we had written our engine to use <a href=\"http:\/\/www.khronos.org\/webgl\/\" title=\"WebGL - OpenGL ES 2.0 for the Web\">WebGL<\/a>, we had to make the game run in Firefox 3.7a versions, aka Minefield, since that has the best WebGL support. The problem is that Minefield doesn&#8217;t have websocket support, so I had to use a bridge to use Flash sockets instead of websockets.<\/p>\n<p>After perusing the web a bit, it turns out there was already a solution out there by <a href=\"http:\/\/gimite.net\/en\/\" title=\"namespace gimite\">gimite<\/a>, aka Hiroshi Ichikawa, that uses a combination of other solutions floating around the Internet to provide websocket support to browsers that don&#8217;t yet provide it natively. You can check it out at <a href=\"http:\/\/github.com\/gimite\/web-socket-js\" title=\"gimite's web-socket-js at master - GitHub\">GitHub<\/a>, but it basically breaks down like this:<\/p>\n<ul>\n<li>FABridge.js &#8211; a JavaScript file apparently provided by Adobe itself from back in 2006. It&#8217;s responsible for navigating AS instances.<\/li>\n<li>WebSocketMain.swf &#8211; a Flash file you embed with swfobject.js. This is the file that actually connects via sockets with the socket server.<\/li>\n<li>swfobject.js &#8211; this is the result of a project called <a href=\"http:\/\/code.google.com\/p\/swfobject\/\" title=\"swfobject - Project Hosting on Google Code\">SWFObject<\/a> by bobbyvandersluis and TenSafeFrogs that aimed to provide a standards-friendly way to embed Flash content with JavaScript.<\/li>\n<li>web_socket.js &#8211; this emulates websockets with the Flash object&#8217;s sockets for browsers that do not natively support websockets. Notice that if the WebSocket object exists, the file returns immediately<\/li>\n<\/ul>\n<p>All you really have to do to set up is include these files into your webpage:<\/p>\n<div class=\"codecolorer-container html4strict railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/><\/div><\/td><td><div class=\"html4strict codecolorer\"><span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span> <span class=\"kw3\">src<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;engine4.js&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span> <span class=\"kw3\">src<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;swfobject.js&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span> <span class=\"kw3\">src<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;FABridge.js&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span> <span class=\"kw3\">src<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;web_socket.js&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a> <span class=\"kw3\">type<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;text\/javascript&quot;<\/span> <span class=\"kw3\">src<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;jquery.min.js&quot;<\/span>&gt;&lt;<span class=\"sy0\">\/<\/span><a href=\"http:\/\/december.com\/html\/4\/element\/script.html\"><span class=\"kw2\">script<\/span><\/a>&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>I also include <a href=\"http:\/\/jquery.com\/\" title=\"jQuery: The Write Less, Do More, JavaScript Library\">JQuery<\/a> because I use it in other places in the game client page (which we&#8217;ll get into at another time). Next, all you have to do is initialize your socket and start writing your client code:<\/p>\n<div class=\"codecolorer-container javascript railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/><\/div><\/td><td><div class=\"javascript codecolorer\"><span class=\"kw1\">var<\/span> ws<span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> up <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> down <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> left <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> right <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> w <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> a <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> s <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> d <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> space <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span> gdata <span class=\"sy0\">=<\/span> <span class=\"st0\">'userdata'<\/span><span class=\"sy0\">;<\/span><br \/>\n$<span class=\"br0\">&#40;<\/span>document<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">ready<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; ws <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> WebSocket<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;ws:\/\/192.168.1.67:12345\/websocket\/server.php&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; ws.<span class=\"me1\">onopen<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; log<span class=\"br0\">&#40;<\/span><span class=\"st0\">'WebSocket - status '<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; ws.<span class=\"me1\">send<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'Initialize connection data'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; ws.<span class=\"me1\">onmessage<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; log<span class=\"br0\">&#40;<\/span><span class=\"st0\">'Received: '<\/span> <span class=\"sy0\">+<\/span> e.<span class=\"me1\">data<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; ws.<span class=\"me1\">onclose<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; log<span class=\"br0\">&#40;<\/span><span class=\"st0\">'Disconnected - status '<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'#msg'<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">focus<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $<span class=\"br0\">&#40;<\/span>document<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">keydown<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">var<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">switch<\/span><span class=\"br0\">&#40;<\/span>e.<span class=\"me1\">keyCode<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">38<\/span><span class=\"sy0\">:<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>up <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> up <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">40<\/span><span class=\"sy0\">:<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>down <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> down <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">37<\/span><span class=\"sy0\">:<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>left <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> left <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">39<\/span><span class=\"sy0\">:<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>right <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> right <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">87<\/span><span class=\"sy0\">:<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>w <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> w <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">65<\/span><span class=\"sy0\">:<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>a <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> a <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">83<\/span><span class=\"sy0\">:<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>s <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> s <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">68<\/span><span class=\"sy0\">:<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>d <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> d <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">32<\/span><span class=\"sy0\">:<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>space <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> space <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span>mapped<span class=\"br0\">&#41;<\/span> send<span class=\"br0\">&#40;<\/span><span class=\"st0\">'1|'<\/span><span class=\"sy0\">+<\/span>gdata<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>up<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>down<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>left<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>right<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>w<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>a<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>s<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>d<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>space<span class=\"sy0\">+<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>Player.<span class=\"me1\">bSphere<\/span>.<span class=\"me1\">x<\/span><span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>Player.<span class=\"me1\">bSphere<\/span>.<span class=\"me1\">y<\/span><span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>Player.<span class=\"me1\">bSphere<\/span>.<span class=\"me1\">z<\/span><span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>Player.<span class=\"me1\">facing<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; $<span class=\"br0\">&#40;<\/span>document<span class=\"br0\">&#41;<\/span>.<span class=\"me1\">keyup<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">function<\/span><span class=\"br0\">&#40;<\/span>e<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">var<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">switch<\/span><span class=\"br0\">&#40;<\/span>e.<span class=\"me1\">keyCode<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">38<\/span><span class=\"sy0\">:<\/span> up <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">40<\/span><span class=\"sy0\">:<\/span> down <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">37<\/span><span class=\"sy0\">:<\/span> left <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">39<\/span><span class=\"sy0\">:<\/span> right <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">87<\/span><span class=\"sy0\">:<\/span> w <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">65<\/span><span class=\"sy0\">:<\/span> a <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">83<\/span><span class=\"sy0\">:<\/span> s <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">68<\/span><span class=\"sy0\">:<\/span> d <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">32<\/span><span class=\"sy0\">:<\/span> space <span class=\"sy0\">=<\/span> mapped <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span>mapped<span class=\"br0\">&#41;<\/span> send<span class=\"br0\">&#40;<\/span><span class=\"st0\">'1|'<\/span><span class=\"sy0\">+<\/span>gdata<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>up<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>down<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>left<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>right<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>w<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>a<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>s<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>d<span class=\"sy0\">+<\/span><span class=\"st0\">'|'<\/span><span class=\"sy0\">+<\/span>space<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> send<span class=\"br0\">&#40;<\/span>msg<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span>msg<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> alert<span class=\"br0\">&#40;<\/span><span class=\"st0\">'Message can not be empty<span class=\"es0\">\\n<\/span>'<\/span> <span class=\"sy0\">+<\/span> msg<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">return<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">try<\/span><span class=\"br0\">&#123;<\/span> ws.<span class=\"me1\">send<\/span><span class=\"br0\">&#40;<\/span>msg<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> log<span class=\"br0\">&#40;<\/span><span class=\"st0\">'Sent: '<\/span><span class=\"sy0\">+<\/span>msg<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">catch<\/span><span class=\"br0\">&#40;<\/span>ex<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span> log<span class=\"br0\">&#40;<\/span>ex<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> quit<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; log<span class=\"br0\">&#40;<\/span><span class=\"st0\">'Goodbye!'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; ws.<span class=\"me1\">close<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; ws <span class=\"sy0\">=<\/span> <span class=\"kw2\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> log<span class=\"br0\">&#40;<\/span>msg<span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; $<span class=\"br0\">&#40;<\/span><span class=\"st0\">'#log'<\/span><span class=\"br0\">&#41;<\/span>.<span class=\"me1\">append<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">'&lt;br \/&gt;'<\/span> <span class=\"sy0\">+<\/span> msg<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>This, in and of itself, is based on the <a href=\"http:\/\/code.google.com\/p\/phpwebsocket\/\" title=\"phpwebsocket - Project Hosting on Google Code\">phpwebsocket<\/a> project by georgenava. I kept his client-side example code largely intact because it turned out to actually serve as a pretty functional debugging console for my game server code. I&#8217;ve modified it, though, to also send keyboard input data. I actually turn this into JSON in my final code, but for now, this is good enough.<\/p>\n<p>You&#8217;ll notice the key parts are line 7 which makes the websocket connection, line 8 which is the function that runs when the connection opens, line 12 which is the function that runs when the websocket receives a message, and line 15 which is the function that runs when the connection is terminated either client or server-side. This is where I put a solid chunk of my game client code, but I left it out so you could get the gist of what&#8217;s happening.<\/p>\n<h2>Server Side<\/h2>\n<p>Like I said before, this is based on georgenava&#8217;s phpwebsocket project. What I&#8217;ve kept mostly untouched are the WebSocket function (makes the socket), listen function (main loop that runs, waiting for data from the sockets), connect function, dohandshake function, getheaders function, and his helper functions like console, say, wrap, and unwrap. I mean, no need to fix what&#8217;s not broken, right?<\/p>\n<div class=\"codecolorer-container php railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/>75<br \/>76<br \/>77<br \/>78<br \/>79<br \/>80<br \/>81<br \/>82<br \/>83<br \/>84<br \/>85<br \/>86<br \/>87<br \/>88<br \/>89<br \/>90<br \/>91<br \/>92<br \/>93<br \/>94<br \/>95<br \/>96<br \/>97<br \/>98<br \/>99<br \/>100<br \/>101<br \/>102<br \/>103<br \/>104<br \/>105<br \/>106<br \/>107<br \/>108<br \/>109<br \/>110<br \/>111<br \/>112<br \/>113<br \/>114<br \/>115<br \/>116<br \/>117<br \/>118<br \/>119<br \/>120<br \/>121<br \/>122<br \/>123<br \/>124<br \/>125<br \/>126<br \/>127<br \/>128<br \/>129<br \/>130<br \/>131<br \/>132<br \/>133<br \/>134<br \/>135<br \/>136<br \/>137<br \/>138<br \/>139<br \/>140<br \/>141<br \/>142<br \/>143<br \/>144<br \/>145<br \/>146<br \/>147<br \/>148<br \/>149<br \/>150<br \/>151<br \/>152<br \/>153<br \/>154<br \/>155<br \/>156<br \/>157<br \/>158<br \/>159<br \/>160<br \/>161<br \/>162<br \/>163<br \/>164<br \/>165<br \/>166<br \/>167<br \/>168<br \/>169<br \/>170<br \/>171<br \/>172<br \/>173<br \/>174<br \/>175<br \/>176<br \/>177<br \/>178<br \/>179<br \/>180<br \/>181<br \/>182<br \/>183<br \/>184<br \/>185<br \/>186<br \/>187<br \/>188<br \/>189<br \/>190<br \/>191<br \/>192<br \/>193<br \/>194<br \/>195<br \/>196<br \/><\/div><\/td><td><div class=\"php codecolorer\"><span class=\"kw2\">&lt;?php<\/span><br \/>\n<span class=\"kw2\">class<\/span> socketServer <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$ip<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$port<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$users<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$games<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$master<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$sockets<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$debug<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"re0\">$dbc<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw2\">function<\/span> __construct<span class=\"br0\">&#40;<\/span><span class=\"re0\">$ip<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$port<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">ip<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$ip<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">port<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$port<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">debug<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">master<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">WebSocket<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$ip<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$port<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">sockets<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">master<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">dbc<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> dbConnect<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/mysql_select_db\"><span class=\"kw3\">mysql_select_db<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'cs4311'<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">dbc<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">conn<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">listen<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> WebSocket<span class=\"br0\">&#40;<\/span><span class=\"re0\">$address<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$port<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$master<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/socket_create\"><span class=\"kw3\">socket_create<\/span><\/a><span class=\"br0\">&#40;<\/span>AF_INET<span class=\"sy0\">,<\/span> SOCK_STREAM<span class=\"sy0\">,<\/span> SOL_TCP<span class=\"br0\">&#41;<\/span> &nbsp; &nbsp; or <a href=\"http:\/\/www.php.net\/die\"><span class=\"kw3\">die<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;socket_create() failed&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/socket_set_option\"><span class=\"kw3\">socket_set_option<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$master<\/span><span class=\"sy0\">,<\/span> SOL_SOCKET<span class=\"sy0\">,<\/span> SO_REUSEADDR<span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> &nbsp; &nbsp;or <a href=\"http:\/\/www.php.net\/die\"><span class=\"kw3\">die<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;socket_option() failed&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/socket_bind\"><span class=\"kw3\">socket_bind<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$master<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$address<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$port<\/span><span class=\"br0\">&#41;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;or <a href=\"http:\/\/www.php.net\/die\"><span class=\"kw3\">die<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;socket_bind() failed&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/socket_listen\"><span class=\"kw3\">socket_listen<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$master<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">20<\/span><span class=\"br0\">&#41;<\/span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; or <a href=\"http:\/\/www.php.net\/die\"><span class=\"kw3\">die<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;socket_listen() failed&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">echo<\/span> <span class=\"st0\">&quot;Server Started : &quot;<\/span> <span class=\"sy0\">.<\/span> <a href=\"http:\/\/www.php.net\/date\"><span class=\"kw3\">date<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'Y-m-d H:i:s'<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">&quot;<span class=\"es1\">\\n<\/span>&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">echo<\/span> <span class=\"st0\">&quot;Master socket &nbsp;: &quot;<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$master<\/span><span class=\"sy0\">.<\/span><span class=\"st0\">&quot;<span class=\"es1\">\\n<\/span>&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">echo<\/span> <span class=\"st0\">&quot;Listening on &nbsp; : &quot;<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$address<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">&quot; port &quot;<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$port<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">&quot;<span class=\"es1\">\\n<\/span><span class=\"es1\">\\n<\/span>&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$master<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> listen<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">while<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw4\">true<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$changed<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">sockets<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/socket_select\"><span class=\"kw3\">socket_select<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$changed<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$write<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">NULL<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$except<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">NULL<\/span><span class=\"sy0\">,<\/span> <span class=\"kw4\">NULL<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">foreach<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$changed<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">checkTime<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span> <span class=\"sy0\">==<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">master<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$client<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/socket_accept\"><span class=\"kw3\">socket_accept<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">master<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$client<\/span> <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'socket_accept() failed'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">continue<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span><span class=\"br0\">&#123;<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">connect<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$client<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$bytes<\/span> <span class=\"sy0\">=<\/span> <span class=\"sy0\">@<\/span><a href=\"http:\/\/www.php.net\/socket_recv\"><span class=\"kw3\">socket_recv<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$buffer<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">2048<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$bytes<\/span> <span class=\"sy0\">==<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">disconnect<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getuserbysocket<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">handshake<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">dohandshake<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$buffer<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">else<\/span><span class=\"br0\">&#123;<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">process<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$buffer<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> connect<span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> User<span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/uniqid\"><span class=\"kw3\">uniqid<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/array_push\"><span class=\"kw3\">array_push<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$user<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/array_push\"><span class=\"kw3\">array_push<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">sockets<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">&quot; CONNECTED!&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> process<span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$msg<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">unwrap<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">say<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;&lt; &quot;<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$data<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/explode\"><span class=\"kw3\">explode<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'|'<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">switch<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">:<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">send<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">socket<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'10|'<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">.<\/span><span class=\"st_h\">'|'<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">.<\/span><span class=\"st_h\">'|'<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">.<\/span><span class=\"st_h\">'|'<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">4<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">.<\/span><span class=\"st_h\">'|Received initialized user data'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gid<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">uip<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">2<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">uid<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gud<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">4<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/array_key_exists\"><span class=\"kw3\">array_key_exists<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">===<\/span> <span class=\"kw4\">FALSE<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$game<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> Game<span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$game<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'New game object '<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">addPlayer<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">socket<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">incrementStat<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">isFull<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$players<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getPlayers<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$msg<\/span> <span class=\"sy0\">=<\/span> <span class=\"st_h\">'0'<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">foreach<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$players<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$player<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$usr<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getuserbyuid<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$player<\/span><span class=\"br0\">&#91;<\/span><span class=\"st_h\">'uid'<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$msg<\/span> <span class=\"sy0\">.=<\/span> <span class=\"st_h\">'|'<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$usr<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gud<\/span> <span class=\"sy0\">.<\/span> <span class=\"st_h\">'|'<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$usr<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">uid<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">broadcast<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">socket<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">:<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">send<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">socket<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'Received input data!'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">broadcast<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">socket<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">case<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">:<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getuserbyuid<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">5<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">!=<\/span> <span class=\"kw4\">null<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">incrementStat<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">5<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">incrementStat<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">2<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">6<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">broadcast<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$data<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">3<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">socket<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">default<\/span><span class=\"sy0\">:<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'Unknown command: '<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> broadcast<span class=\"br0\">&#40;<\/span><span class=\"re0\">$gid<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$uid<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$socket<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$msg<\/span> <span class=\"sy0\">=<\/span> <span class=\"st_h\">''<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$players<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$gid<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getPlayers<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">foreach<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$players<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$player<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$player<\/span><span class=\"br0\">&#91;<\/span><span class=\"st_h\">'uid'<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">!=<\/span> <span class=\"re0\">$uid<\/span><span class=\"br0\">&#41;<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">send<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$player<\/span><span class=\"br0\">&#91;<\/span><span class=\"st_h\">'socket'<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> send<span class=\"br0\">&#40;<\/span><span class=\"re0\">$client<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">say<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;&gt; &quot;<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$msg<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">wrap<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/socket_write\"><span class=\"kw3\">socket_write<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$client<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$msg<\/span><span class=\"sy0\">,<\/span> <a href=\"http:\/\/www.php.net\/strlen\"><span class=\"kw3\">strlen<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span> <br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> disconnect<span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$found<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$n<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/count\"><span class=\"kw3\">count<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">for<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$i<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span> <span class=\"re0\">$i<\/span> <span class=\"sy0\">&lt;<\/span> <span class=\"re0\">$n<\/span><span class=\"sy0\">;<\/span> <span class=\"re0\">$i<\/span><span class=\"sy0\">++<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$i<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">socket<\/span> <span class=\"sy0\">==<\/span> <span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"re0\">$found<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$i<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span><a href=\"http:\/\/www.php.net\/is_null\"><span class=\"kw3\">is_null<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">broadcast<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gid<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">uid<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span> <span class=\"st_h\">'2|'<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gid<\/span><span class=\"sy0\">.<\/span><span class=\"st_h\">'|'<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">uip<\/span><span class=\"sy0\">.<\/span><span class=\"st_h\">'|'<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">uid<\/span><span class=\"sy0\">.<\/span><span class=\"st_h\">'|'<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gud<\/span><span class=\"sy0\">.<\/span><span class=\"st_h\">'|'<\/span><span class=\"sy0\">.<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">uid<\/span><span class=\"sy0\">.<\/span><span class=\"st_h\">'|0'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gid<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">dropPlayer<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">uid<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/count\"><span class=\"kw3\">count<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gid<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">players<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&lt;<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$query<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/sprintf\"><span class=\"kw3\">sprintf<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;DELETE FROM games WHERE gid = '<span class=\"es6\">%s<\/span>'&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gid<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span><a href=\"http:\/\/www.php.net\/mysql_query\"><span class=\"kw3\">mysql_query<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$query<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">dbc<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">conn<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'Failed to delete game '<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gid<\/span> <span class=\"sy0\">.<\/span> <span class=\"st_h\">' from the database: '<\/span> <span class=\"sy0\">.<\/span> <a href=\"http:\/\/www.php.net\/mysql_error\"><span class=\"kw3\">mysql_error<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/unset\"><span class=\"kw3\">unset<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">games<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"br0\">&#91;<\/span><span class=\"re0\">$found<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">gid<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/array_splice\"><span class=\"kw3\">array_splice<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$found<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$index<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/array_search\"><span class=\"kw3\">array_search<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">sockets<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/socket_close\"><span class=\"kw3\">socket_close<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">&quot; DISCONNECTED!&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$index<\/span> <span class=\"sy0\">&gt;=<\/span> <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <a href=\"http:\/\/www.php.net\/array_splice\"><span class=\"kw3\">array_splice<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">sockets<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$index<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> dohandshake<span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$buffer<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;<span class=\"es1\">\\n<\/span>Requesting handshake...&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$buffer<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/list\"><span class=\"kw3\">list<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$resource<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$host<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$origin<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">getheaders<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$buffer<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Handshaking...&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$upgrade<\/span> &nbsp;<span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;HTTP\/1.1 101 Web Socket Protocol Handshake<span class=\"es1\">\\r<\/span><span class=\"es1\">\\n<\/span>&quot;<\/span> <span class=\"sy0\">.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;Upgrade: WebSocket<span class=\"es1\">\\r<\/span><span class=\"es1\">\\n<\/span>&quot;<\/span> <span class=\"sy0\">.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;Connection: Upgrade<span class=\"es1\">\\r<\/span><span class=\"es1\">\\n<\/span>&quot;<\/span> <span class=\"sy0\">.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;WebSocket-Origin: &quot;<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$origin<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">&quot;<span class=\"es1\">\\r<\/span><span class=\"es1\">\\n<\/span>&quot;<\/span> <span class=\"sy0\">.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;WebSocket-Location: ws:\/\/&quot;<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$host<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$resource<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">&quot;<span class=\"es1\">\\r<\/span><span class=\"es1\">\\n<\/span>&quot;<\/span> <span class=\"sy0\">.<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"st0\">&quot;<span class=\"es1\">\\r<\/span><span class=\"es1\">\\n<\/span>&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <a href=\"http:\/\/www.php.net\/socket_write\"><span class=\"kw3\">socket_write<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">socket<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$upgrade<\/span> <span class=\"sy0\">.<\/span> <a href=\"http:\/\/www.php.net\/chr\"><span class=\"kw3\">chr<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span> <a href=\"http:\/\/www.php.net\/strlen\"><span class=\"kw3\">strlen<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$upgrade<\/span> <span class=\"sy0\">.<\/span> <a href=\"http:\/\/www.php.net\/chr\"><span class=\"kw3\">chr<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">handshake<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$upgrade<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">console<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Done handshaking...&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"kw4\">true<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> getheaders<span class=\"br0\">&#40;<\/span><span class=\"re0\">$req<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$r<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$h<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$o<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/preg_match\"><span class=\"kw3\">preg_match<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/GET (.*) HTTP\/&quot;<\/span> &nbsp; <span class=\"sy0\">,<\/span><span class=\"re0\">$req<\/span><span class=\"sy0\">,<\/span><span class=\"re0\">$match<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"re0\">$r<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$match<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/preg_match\"><span class=\"kw3\">preg_match<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/Host: (.*)<span class=\"es1\">\\r<\/span><span class=\"es1\">\\n<\/span>\/&quot;<\/span> &nbsp;<span class=\"sy0\">,<\/span><span class=\"re0\">$req<\/span><span class=\"sy0\">,<\/span><span class=\"re0\">$match<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"re0\">$h<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$match<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/preg_match\"><span class=\"kw3\">preg_match<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/Origin: (.*)<span class=\"es1\">\\r<\/span><span class=\"es1\">\\n<\/span>\/&quot;<\/span><span class=\"sy0\">,<\/span><span class=\"re0\">$req<\/span><span class=\"sy0\">,<\/span><span class=\"re0\">$match<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"re0\">$o<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$match<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$r<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$h<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$o<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> getuserbysocket<span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$found<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">foreach<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$user<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">socket<\/span> <span class=\"sy0\">==<\/span> <span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"re0\">$found<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$found<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> getuserbyuid<span class=\"br0\">&#40;<\/span><span class=\"re0\">$uid<\/span> <span class=\"sy0\">=<\/span> <span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$found<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">null<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">foreach<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">users<\/span> <span class=\"kw1\">as<\/span> <span class=\"re0\">$user<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$user<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">uid<\/span> <span class=\"sy0\">==<\/span> <span class=\"re0\">$uid<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"re0\">$found<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$user<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">break<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"re0\">$found<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> console<span class=\"br0\">&#40;<\/span><span class=\"re0\">$msg<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$this<\/span><span class=\"sy0\">-&gt;<\/span><span class=\"me1\">debug<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">echo<\/span> <span class=\"re0\">$msg<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">&quot;<span class=\"es1\">\\n<\/span>&quot;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> &nbsp; &nbsp; say<span class=\"br0\">&#40;<\/span><span class=\"re0\">$msg<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">echo<\/span> <span class=\"re0\">$msg<\/span> <span class=\"sy0\">.<\/span> <span class=\"st0\">&quot;<span class=\"es1\">\\n<\/span>&quot;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> &nbsp; &nbsp;wrap<span class=\"br0\">&#40;<\/span><span class=\"re0\">$msg<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">return<\/span> <a href=\"http:\/\/www.php.net\/chr\"><span class=\"kw3\">chr<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">.<\/span> <span class=\"re0\">$msg<\/span> <span class=\"sy0\">.<\/span> <a href=\"http:\/\/www.php.net\/chr\"><span class=\"kw3\">chr<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"nu0\">255<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw2\">private<\/span> <span class=\"kw2\">function<\/span> &nbsp;unwrap<span class=\"br0\">&#40;<\/span><span class=\"re0\">$msg<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;&quot;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">return<\/span> <a href=\"http:\/\/www.php.net\/substr\"><span class=\"kw3\">substr<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$msg<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span> <a href=\"http:\/\/www.php.net\/strlen\"><span class=\"kw3\">strlen<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$msg<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"sy1\">?&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>The really important part is the listen function. It runs on an infinite while loop and listens to the socket for any incoming data. You&#8217;ll notice that in the <a href=\"http:\/\/php.net\/manual\/en\/function.socket-select.php\" title=\"PHP: socket_select - Manual\">socket_select<\/a> function call (a built-in PHP method), the fourth parameter is NULL, meaning that it can block indefinitely to receive data. If it didn&#8217;t, we would end up disconnecting every connected client due to the else statement at line 47. It says that if the bytes received by the socket is equal to zero, then disconnect that client because it hasn&#8217;t sent any data and likely isn&#8217;t viewing the page anymore. This causes a slight problem with checking the time left for a game round, but that&#8217;s something we decided to live with for now.<\/p>\n<p>Next, you should take notice of the dohandshake function. The way <a href=\"http:\/\/en.wikipedia.org\/wiki\/Web_Sockets#WebSocket_Protocol_Upgrade_Handshake\" title=\"Web Sockets - Wikipedia, the free encyclopedia\">websockets work<\/a> is that servers respond to GET requests that have the Connection field set to &#8220;Upgrade&#8221; (among other things) with a handshake response. They communicate a token so they can authenticate each other&#8217;s handshakes. After this, the client and server have full-duplex communication capabilities, perfect for our game.<\/p>\n<p>I&#8217;ve removed a lot other functions from the SocketServer class so that we can focus on just the socket stuff. I&#8217;ve also chosen to not include the Game, User, and dbConnect classes since they don&#8217;t have anything whatsoever to do with sockets, but if you really want to see them, you can ask for them in the comments below. The process function, however, has been untouched just so you can see that the data sent from the JavaScript of the client is unchanged once it gets to the server.<\/p>\n<p>To run the server, you&#8217;ve got instantiate the SocketServer from another PHP file with the proper IP and port that you&#8217;d like to run it from and then run the file from the server&#8217;s shell or command prompt. Also, in most server configurations, you&#8217;ve got to run a Flash socket policy server. You can head over to <a href=\"http:\/\/www.lightsphere.com\/dev\/articles\/flash_socket_policy.html\" title=\"Kira's Web Toolbox: Setting Up A Flash Socket Policy File\">Jacqueline Kira Hamilton&#8217;s writeup<\/a> on the topic and run her Perl script, otherwise connecting to your server may end in terminal sadness.<\/p>\n<div class=\"codecolorer-container php railscasts\" style=\"overflow:auto;white-space:nowrap;width:100%;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/><\/div><\/td><td><div class=\"php codecolorer\"><span class=\"co2\">#!\/usr\/bin\/php -q<br \/>\n<\/span><span class=\"kw2\">&lt;?php<\/span><br \/>\n<br \/>\n<a href=\"http:\/\/www.php.net\/error_reporting\"><span class=\"kw3\">error_reporting<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"kw4\">E_ALL<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<a href=\"http:\/\/www.php.net\/set_time_limit\"><span class=\"kw3\">set_time_limit<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<a href=\"http:\/\/www.php.net\/ob_implicit_flush\"><span class=\"kw3\">ob_implicit_flush<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">include_once<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'classes\/SocketServer.php'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">include_once<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'classes\/User.php'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">include_once<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'classes\/Game.php'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw1\">include_once<\/span><span class=\"br0\">&#40;<\/span><span class=\"st_h\">'classes\/dbConnect.php'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"re0\">$ip<\/span> <span class=\"sy0\">=<\/span> <span class=\"st_h\">'129.118.120.190'<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"re0\">$port<\/span> <span class=\"sy0\">=<\/span> <span class=\"nu0\">12345<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\ntry<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; <span class=\"re0\">$mySocketServer<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> SocketServer<span class=\"br0\">&#40;<\/span><span class=\"re0\">$ip<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$port<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span> catch <span class=\"br0\">&#40;<\/span>Project_Exception_AutoLoad <span class=\"re0\">$e<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">echo<\/span> <span class=\"st0\">&quot;FATAL ERROR: CAN'T FIND SOCKET SERVER CLASS.&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"sy1\">?&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>Anyways, that&#8217;s enough of that. If I feel like it, I may start to go over the game engine, but that is upwards of 1,000 lines of code, so that may never happen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p><a href=\"http:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2010\/05\/EngineBuild3.jpg\"><img decoding=\"async\" src=\"http:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2010\/05\/EngineBuild3.jpg\" alt=\"Mega Hovertank Wars\" title=\"Mega Hovertank Wars\" width=\"100%\" class=\"aligncenter size-full wp-image-29\" srcset=\"https:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2010\/05\/EngineBuild3.jpg 650w, https:\/\/timothypoon.com\/blog\/wp-content\/uploads\/2010\/05\/EngineBuild3-300x225.jpg 300w\" sizes=\"(max-width: 650px) 100vw, 650px\" \/><\/a><\/p>\n<p>For my senior design project class, my group decided to try our hand at making a multiplayer 3D tank shooter game (called Mega Hovertank Wars) that plays in an <a href=\"http:\/\/dev.w3.org\/html5\/spec\/Overview.html\" title=\"HTML5\">HTML5<\/a>-compliant browser. Along with one other team member (the other two were pretty much dead weight), we worked heartily on the game engine, but it turns out he didn&#8217;t have much experience with programming in anything except JavaScript. Obviously, that won&#8217;t cut it for writing a game server.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[10,8,9],"class_list":["post-23","post","type-post","status-publish","format-standard","hentry","category-code","tag-megahovertankwars","tag-php","tag-sockets","et-no-image","et-bg-layout-dark","et-white-bg"],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p462yg-n","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/posts\/23","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/comments?post=23"}],"version-history":[{"count":0,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"wp:attachment":[{"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/timothypoon.com\/blog\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}