ServerSocketX

From Noisebridge
(Redirected from SocketX)
Jump to navigation Jump to search

A ßêãµ Project

Implementation of a basic "server" socket in AS3[1], default is a HTTP 0.9[2] web server implementation on port 8080. A running instance of this server generates a HTML HelloWorld page at http://localhost:8080

Request from client:

GET / HTTP/1.1

Response from Server:

<!DOCTYPE html>
<html>
  <head>
    <title>Hello HTML</title>
  </head>
  <body>
    <p>Hello World!</p>
  </body>
</html>

Source Code:

package
{
	import flash.display.Sprite;
	import flash.net.ServerSocket;
	import flash.events.ServerSocketConnectEvent;
	import flash.net.Socket;
	import flash.events.ProgressEvent;
	import flash.events.IOErrorEvent;
	import flash.events.Event;
	import flash.events.OutputProgressEvent;
	
	public class ServerSocketX extends Sprite
	{
		private var serverSocket:ServerSocket;
		private var clientSockets:Object;

		public function ServerSocketX() 
		{
			clientSockets = [];
			
			serverSocket = new ServerSocket();
			
			serverSocket.addEventListener(Event.CONNECT, connectHandler);
			serverSocket.addEventListener(Event.CLOSE, onClose);
			
			serverSocket.bind(8080, "127.0.0.1");
			
			serverSocket.listen();
			
			trace("Server Socket listenting.");
		}
		
		private function connectHandler(e:ServerSocketConnectEvent):void
		{
			var socket:Socket = e.socket as Socket;
			clientSockets[socket.remoteAddress + socket.remotePort] = socket;
			
			socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
			socket.addEventListener(Event.CLOSE, onClientClose);
			socket.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
			socket.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, progressHandler);
			
			trace("Connect: " + socket.remoteAddress + ":" + socket.remotePort);
		}
		
		private function closeSocket(socket:Socket):void
		{
			trace("Close: " + socket.remoteAddress + ":" + socket.remotePort);
			
			socket.removeEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
			socket.removeEventListener(Event.CLOSE, onClientClose);
			socket.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
			socket.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, progressHandler);
			
			clientSockets[socket.remoteAddress + socket.remotePort] = null;
			
			if (socket.connected)
				socket.close();
			
			socket = null;
		}
		
		private function progressHandler(e:OutputProgressEvent):void
		{
			if (e.bytesPending == 0)
			{
				var socket:Socket = e.target as Socket;
				closeSocket(socket);
			}
		}
		
		private function socketDataHandler(e:ProgressEvent):void
		{
			var socket:Socket = e.target as Socket;
			var msg:String = socket.readUTFBytes(socket.bytesAvailable);
			
			trace(socket.remoteAddress + ":" + socket.remotePort + "<" + msg.substr(0, msg.indexOf("\n")));
			
			// check for http GET /
			if (msg.substr(0, 6) == "GET / ")
			{
				socket.writeUTFBytes("<!DOCTYPE html><html><head><title>Hello HTML</title></head><body><p>Hello World!</p></body></html>");
				socket.flush();
			}
			else
			{
				closeSocket(socket);
			}
		}
		
		private function onClientClose(e:Event):void
		{
			var socket:Socket = e.target as Socket;
			closeSocket(socket);
		}
		
		private function onIOError(e:IOErrorEvent):void
		{
			trace("ERROR: " + e.text);
		}
		
		private function onClose(e:Event):void
		{
			trace("Server socket closed.");
		}

	}
	
}