hello, world websocket in quercus/php
A "hello, world" WebSocket servlet using the Quercus PHP implementation WebSocket is a new browser capability being developed for HTML 5 browsers, enabling fully interactive applications. With WebSockets, both the browser and the server can send asynchronous messages over a single TCP socket, without resorting to long polling or comet. Essentially, a WebSocket is a standard bidirectional TCP socket between the client and the server. The socket starts out as a HTTP connection and then "Upgrades" to a TCP socket after a HTTP handshake. After the handshake, either side can send data. GET /test HTTP/1.1 Upgrade: WebSocket Connection: Upgrade Origin: http://localhost/test Host: localhost Content-Length: 0 ... HTTP/1.1 101 Web Socket Protocol Handshake Upgrade: WebSocket Connection: Upgrade Server: Resin/4.0.2 WebSocket-Location: ws://localhost/websocket WebSocket-Origin: http://localhost/test Content-Length: 0 Date: Fri, 08 May 2009 09:51:31 GMT ... WebSocket packetsAfter the WebSocket connection is established, all data is encoded in lightweight packets. While the spec defines a text packet and a binary packet format, browsers use the text packet exclusively. (Resin's HMTP uses the binary packet format.) A text packet is the byte 0x00 followed by UTF-8 encoded data followed by a 0xff byte. x00 utf-8-data xff \x00hello, world\xff Since the tutorial is a hello, world, the JavaScript just does the following:
The JavaScript for this example has been tested with the nightly build of Chromium. Connecting to the WebSocket in JavaScript<?php $url = "ws://localhost:8080/example/websocket"; ?> <script language='javascript'> function onopen(event) { ... } function onmessage(event) { ... } function onclose(event) { ... } ws = new WebSocket("<?= $url ?>"); wsopen.ws = ws; ws.onopen = wsopen; ws.onmessage = wsmessage; ws.onclose = wsclose; </script> Receiving WebSocket data in JavaScript<script language='javascript'> function wsmessage(event) { data = event.data; alert("Received: [" + data + "]"); } </script> Sending WebSocket data in JavaScript<script language='javascript'> function wsopen(event) { ws = this.ws; ws.send("my-message"); } ws = new WebSocket(...); wsopen.ws = ws; ws.onopen = wsopen; </script> Resin's WebSocket PHP support requires two PHP files. The first accepts the WebSocket request and Upgrades the HTTP request. The second handles WebSocket messages. To upgrade a HTTP socket to WebSocket, use
<?php $ws = websocket_start("websocket-handler.php"); The WebSocket handler is the heart of the server-side implementation of websockets. It is a single-threaded listener for client events. When a new packet is available, Resin will call the script, expecting it to read data from the client. While the handler is processing, Resin will not call it again until the first one has completed processing. In this example, the handler reads a WebSocket text packet and sends a response. <?php // read the next packet from the client $value = websocket_read(); if ($value == "hello") { websocket_write("world"); } else if ($value == "server") { websocket_write("Resin PHP"); }
|