WebSockets: Flash-Fallback mit web-socket-js
In älteren Webbrowsern können WebSockets z.B. via Flash oder Java benutzt werden. Eine fertige Flashlösung ist web-socket-js von Hiroshi Ichikawa.
Hinzugefügt und geladen werden brauchen nur die 4 Dateien
FABridge.js, swfobject.js, web_socket.js und WebSocketMain.swf
von web-socket-js (Download).
Diese werden eingebunden mit:
<script type="text/javascript" src="swfobject.js"></script> <script type="text/javascript" src="FABridge.js"></script> <script type="text/javascript" src="web_socket.js"></script>
und der Zeile:
// URL auf WebSocketMain.swf WEB_SOCKET_SWF_LOCATION = "WebSocketMain.swf";
Flash: Socket-Policy-File
Zusätzlich muss für Flash 9+ mit dem Socket-Policy-File der Zugriff auf dem Server via Flash-Sockets erlaubt werden:
<?xml version="1.0"?> <!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd"> <cross-domain-policy> <site-control permitted-cross-domain-policies="master-only"/> <allow-access-from domain="www.sven-drieling.de" to-ports="12345" /> </cross-domain-policy>
Bevorzugt wird diese Datei auf Port #843 bereitgestellt. Findet Flash sie dort nicht, dann sendet Flash in einem zweitem Versuch den Socket-Policy-Request an den Port mit dem die Verbindung aufgebaut werden soll - in diesem Fall Port #12345. Ich benutze derzeit letztere Möglichkeit wodurch der Verbindungsaufbau etwas länger dauert.
Läuft
Damit steht dann ein WebSocket()
-Objekt zur Verfügung,
welches sich wie das in neueren Webbrowsern vorhandene verhält,
so dass am restlichen Skript nichts geändert werden muss.
Echo-Demo (Zur Zeit nicht online): http://www.sven-drieling.de:12345/
Mit Firefox 3.6.6 funktioniert diese Lösung problemlos. In Opera 10.60 fehlt bei mir mit den eigenen WebSocket-Server oft ein erfolgreiches Öffnen 'onOpen' der Verbindung.
Die benutzte Technik erkennt das Skript mit folgender Abfrage:
socket = new WebSocket(url); if(socket.__createFlash) { log("Benutze Flash-Fallback.") } else { log("Benutze WebSocket() des Webbrowsers.") }