Skip to content

Instantly share code, notes, and snippets.

@taiyoh
Created February 9, 2011 09:36
Show Gist options
  • Save taiyoh/818207 to your computer and use it in GitHub Desktop.
Save taiyoh/818207 to your computer and use it in GitHub Desktop.
汎用通知ソケットコネクション
package {
import flash.system.Security;
import flash.system.SecurityPanel;
import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.net.Socket;
import flash.events.*;
import flash.external.ExternalInterface;
import flash.utils.setTimeout;
public class NotificationSocket extends Sprite {
private var socket:Socket;
private var host:String;
public function NotificationSocket() {
host = ExternalInterface.call('window.location.host.toString');
Security.loadPolicyFile("http://" + host + "/crossdomain.xml");
newConnection(host, 80);
}
private function newConnection(host:String, port:int):void {
debugLog('newConnection', host, port);
socket = new Socket();
socket.addEventListener(Event.CONNECT, connectHandler);
socket.addEventListener(Event.CLOSE, closeHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
try {
socket.connect(host, port);
}
catch (error:Error) {
socket.close();
}
}
private function debugLog(...args):void {
if (ExternalInterface.available) {
args.unshift('[FLASH]');
args.unshift("console.log");
ExternalInterface.call.apply(ExternalInterface.call, args);
}
}
private function connectHandler(evt:Event):void {
debugLog('connected', socket.connected);
socket.writeUTFBytes("GET /stream/listen HTTP/1.1\r\n");
socket.writeUTFBytes("Host: "+ host +"\r\n");
socket.writeUTFBytes("Connection: Keep-Alive\r\n");
socket.writeUTFBytes("\r\n");
socket.flush();
var self:NotificationSocket = this;
setTimeout(function():void {
self.debugLog('55sec. close');
self.closing();
}, 55000);
}
private function closing():void {
socket.close();
socket.removeEventListener(Event.CONNECT, connectHandler);
socket.removeEventListener(Event.CLOSE, closeHandler);
socket.removeEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
socket.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
socket.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
var self:NotificationSocket = this;
setTimeout(function():void {
self.newConnection(self.host, 80);
}, 100);
}
private function closeHandler(evt:Event):void {
debugLog('disconnected. connect again');
closing();
}
private function securityErrorHandler(evt:Event):void {
debugLog('securityError');
}
private function ioErrorHandler(evt:Event):void {
debugLog('ioError');
}
private function socketDataHandler(evt:ProgressEvent):void {
var text:String = socket.readUTFBytes(socket.bytesAvailable);
if (/^HTTP/.test(text)) return; // ignore response header
text = text.replace(/^(.+)\r\n/, ''); // delete chunk
ExternalInterface.call("_socketDataHandler", text);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment