Advertisement
YellowAfterlife

Dead-simple cross-platform TCP sockets in Haxe

Jan 19th, 2013
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Haxe 3.98 KB | None | 0 0
  1. package ;
  2.  
  3. import nme.display.Sprite;
  4. import nme.events.Event;
  5. import nme.events.MouseEvent;
  6. import nme.Lib;
  7. import nme.text.TextField;
  8. import sys.net.Host;
  9. import sys.net.Socket;
  10.  
  11. /**
  12.  * ...
  13.  * @author YellowAfterlife
  14.  */
  15.  
  16. class NetActivity {
  17.     public var socket:Socket;
  18.     public function new() {
  19.         socket = new Socket();
  20.         socket.setTimeout(1.0);
  21.         socket.setBlocking(false);
  22.     }
  23.     public function update() {
  24.        
  25.     }
  26.     public function ping() {
  27.        
  28.     }
  29. }
  30.  
  31. class NetClient extends NetActivity {
  32.     public function new() {
  33.         super();
  34.         try {
  35.             socket.connect(Main.host, Main.port);
  36.         } catch (z:Dynamic) {
  37.             Lib.trace('Can\'t connect: ' + z);
  38.             return;
  39.         }
  40.     }
  41.    
  42.     override public function update():Dynamic {
  43.         var data = socket.read();
  44.         if (data != '') {
  45.             Lib.trace('In: ' + data);
  46.         }
  47.     }
  48.     override public function ping():Dynamic {
  49.         socket.write('Client ping!');
  50.     }
  51. }
  52.  
  53. class NetServer extends NetActivity {
  54.     public var clients:Array<Socket>;
  55.     public function new() {
  56.         super();
  57.         socket.bind(Main.host, Main.port);
  58.         socket.listen(3);
  59.         clients = [];
  60.     }
  61.     override public function update():Dynamic {
  62.         // poll clients:
  63.         for (client in clients) {
  64.             try {
  65.                 var data = client.read();
  66.                 if (data != '') {
  67.                     Lib.trace(client.peer().host.toString() + ': ' + data);
  68.                 }
  69.             } catch (z:Dynamic) {
  70.                 Lib.trace('Polling error: ' + z);
  71.             }
  72.         }
  73.         // accept new clients:
  74.         try {
  75.             var client = socket.accept();
  76.             if (client != null) {
  77.                 clients.push(client);
  78.                 Lib.trace(client.peer().host.toString() + ' joined.');
  79.                 client.write('Welcome');
  80.             }
  81.         } catch (z:Dynamic) {
  82.             // listening fails, but it's considered fine for non-blocking?
  83.         }
  84.     }
  85.     override public function ping():Dynamic {
  86.         for (client in clients) {
  87.             client.write('Server ping!');
  88.         }
  89.     }
  90. }
  91.  
  92. class Main extends Sprite {
  93.     public static var host:Host;
  94.     public static var port:Int = 17051;
  95.     public static var activity:NetActivity;
  96.     var clock:Sprite;
  97.     var btHost:TextField;
  98.     var btJoin:TextField;
  99.     var btTest:TextField;
  100.    
  101.     function init(e) {
  102.         Lib.trace('Started up.');
  103.         host = new Host('127.0.0.1');
  104.         //
  105.         btHost = new TextField();
  106.         btJoin = new TextField();
  107.         btTest = new TextField();
  108.         // Add buttons
  109.         btHost.x = 20;
  110.         btJoin.x = 150;
  111.         btTest.x = 280;
  112.         btHost.text = 'Host';
  113.         btJoin.text = 'Join';
  114.         btTest.text = 'Test';
  115.         for (bt in [btHost, btJoin, btTest]) {
  116.             bt.width = 100;
  117.             bt.height = 30;
  118.             bt.selectable = false;
  119.             bt.y = 30;
  120.             bt.background = true;
  121.             bt.backgroundColor = 0xd0d0d0;
  122.             Lib.current.addChild(bt);
  123.         }
  124.         // add buttton events:
  125.         btHost.addEventListener(MouseEvent.CLICK, function(e) {
  126.             if (activity != null) return;
  127.             Lib.trace('Server mode.');
  128.             activity = new NetServer();
  129.         });
  130.         btJoin.addEventListener(MouseEvent.CLICK, function(e) {
  131.             if (activity != null) return;
  132.             Lib.trace('Client mode.');
  133.             activity = new NetClient();
  134.         });
  135.         btTest.addEventListener(MouseEvent.CLICK, function(e) {
  136.             if (activity != null) {
  137.                 activity.ping();
  138.             } else Lib.trace('There\'s no activity.');
  139.         });
  140.         // Add an event loop handler. It is said that it's the wrong way of doing this.
  141.         Lib.current.addEventListener(Event.ENTER_FRAME, function(e) {
  142.             if (activity != null) activity.update();
  143.         });
  144.         // Add a spinning thing as a lag visualizer:
  145.         clock = new Sprite();
  146.         clock.graphics.beginFill(0x004499);
  147.         clock.graphics.drawRect(0, -4, 64, 8);
  148.         clock.x = 100;
  149.         clock.y = 150;
  150.         Lib.current.addChild(clock);
  151.         Lib.current.addEventListener(Event.ENTER_FRAME, function(e) {
  152.             clock.rotation += 1;
  153.         });
  154.     }
  155.     public function new() {
  156.         super();
  157.         #if iphone
  158.         Lib.current.stage.addEventListener(Event.RESIZE, init);
  159.         #else
  160.         addEventListener(Event.ADDED_TO_STAGE, init);
  161.         #end
  162.     }
  163.    
  164.     static public function main() {
  165.         var stage = Lib.current.stage;
  166.         stage.scaleMode = nme.display.StageScaleMode.NO_SCALE;
  167.         stage.align = nme.display.StageAlign.TOP_LEFT;
  168.        
  169.         Lib.current.addChild(new Main());
  170.     }
  171.    
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement