ServerSocketX

From Noisebridge
(Difference between revisions)
Jump to: navigation, search
(Created page with "Implementation of a basic "server" socket, default is a HTTP 0.9[http://www.w3.org/Protocols/HTTP/AsImplemented.html] web server implementation on port 8080. A running instanc...")
 
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Implementation of a basic "server" socket, default is a HTTP 0.9[http://www.w3.org/Protocols/HTTP/AsImplemented.html] web server implementation on port 8080. A running instance of this server generates a HTML HelloWorld page at http://localhost:8080
+
A [[ßêãµ]] Project
 +
 
 +
Implementation of a basic "server" socket in AS3[http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/ServerSocket.html], default is a HTTP 0.9[http://www.w3.org/Protocols/HTTP/AsImplemented.html] web server implementation on port 8080. A running instance of this server generates a HTML HelloWorld page at http://localhost:8080
 +
 
 +
Request from client:
 +
<pre>
 +
GET / HTTP/1.1
 +
</pre>
 +
 
 +
Response from Server:
 +
<pre>
 +
<!DOCTYPE html>
 +
<html>
 +
  <head>
 +
    <title>Hello HTML</title>
 +
  </head>
 +
  <body>
 +
    <p>Hello World!</p>
 +
  </body>
 +
</html>
 +
</pre>
 +
 
 +
Source Code:
 +
<pre>
 +
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.");
 +
}
 +
 
 +
}
 +
 +
}
 +
</pre>

Latest revision as of 18:55, 7 April 2013

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.");
		}

	}
	
}
Personal tools