hx-esocklib
⚠️ Warning: This library was made to study Haxe networking.
This is mostly a Proof of Concept and may not receive many updates.
This is the repository for hx-esocklib (short for Event-Based Socket Library), an alternative implementation for TCP and UDP sockets powered by an event system.
The use of events eliminates the need for manually checking to see if there's any new clients or data while massively simplifying the code writing process.
Implementation partially based on OpenFL's socket and NodeJS's socket.
Basic Usage Samples
TCP Client
import esock.net.SocketError;
import esock.net.tcp.Socket;
import haxe.io.Bytes;
var socket:Socket = new Socket();
socket.addListener(onConnect, () ->
{
trace("Connection established!");
socket.write("Ping");
});
socket.addListener(onData, (buffer:Bytes) ->
{
trace("Incoming data: " + buffer.toString());
});
socket.addListener(onError, (err:SocketError) ->
{
trace("Error: " + err.getName());
});
socket.addListener(onClose, (hadErr:Bool) ->
{
if (hadErr)
trace("Socket closed prematurely.");
else
trace("Socket closed.");
});
socket.connect("127.0.0.1", 3000);
while (!socket.closed)
socket.poll();
TCP Server
import esock.net.SocketError;
import esock.net.tcp.Server;
import esock.net.tcp.Socket;
import haxe.io.Bytes;
var server:Server = new Server();
server.addListener(onListening, () ->
{
trace("Listening on " + server.localAddress + ":" + server.localPort);
});
server.addListener(onConnection, (client:Socket) ->
{
trace("Client connected.");
client.addListener(onData, (buffer:Bytes) ->
{
var str:String = buffer.toString();
trace("Incoming data: " + str);
if (str == "Ping")
client.write("Pong");
});
client.addListener(onError, (err:SocketError) ->
{
trace("Client error: " + err.getName());
});
client.addListener(onClose, (hadErr:Bool) ->
{
if (hadErr)
trace("Client closed prematurely.");
else
trace("Client closed.");
});
});
server.addListener(onError, (err:SocketError) ->
{
trace("Error: " + err.getName());
});
server.addListener(onClose, (hadErr:Bool) ->
{
if (hadErr)
trace("Server closed prematurely.");
else
trace("Server closed.");
});
server.listen();
while (server.listening)
server.poll();
UDP Socket
import esock.net.SocketError;
import esock.net.udp.Socket;
import haxe.io.Bytes;
var socket:Socket = new Socket();
socket.addListener(onData, (buffer:Bytes, from:{address:String, port:Int}) ->
{
var str:String = buffer.toString();
trace("Incoming data: " + str);
if (str == 'Ping')
socket.writeTo('Pong', from.address, from.port);
});
socket.addListener(onError, (err:SocketError) ->
{
trace("Error: " + err.getName());
});
while (true)
socket.poll();
Reference
Events
TCP Socket:
| Event | Description | Arguments |
|---|---|---|
onConnect | Dispatches whenever a new connection has been established. | () |
onData | Dispatches whenever new data is available. | (buffer:haxe.io.Bytes) |
onError | Dispatches whenever an error has occurred. | (err:esock.net.SocketError) |
onClose | Dispatches whenever this socket is closed. | (hadErr:Bool) |
TCP Server:
| Event | Description | Arguments |
|---|---|---|
onListening | Dispatches whenever this socket starts listening for new connections. | () |
onConnection | Dispatches whenever a new socket has connected to this socket. | (client:esock.net.tcp.Socket) |
onError | Dispatches whenever an error has occurred. | (err:esock.net.SocketError) |
onClose | Dispatches whenever this socket is closed. | (hadErr:Bool) |
UDP Socket:
| Event | Description | Arguments |
|---|---|---|
onData | Dispatches whenever new data is available. | (buffer:haxe.io.Bytes, from:{address:String, port:Int}) |
onError | Dispatches whenever an error has occurred. | (err:esock.net.SocketError) |