### Platform Support The following shows net module APIs available for each platform. | | Linux
(Ubuntu) | Raspbian
(Raspberry Pi) | NuttX
(STM32F4-Discovery) | TizenRT
(Artik053) | | :---: | :---: | :---: | :---: | :---: | | net.createServer | O | O | △ ¹ | △ ¹ | | net.connect | O | O | △ ¹ | △ ¹ | | net.createConnection | O | O | △ ¹ | △ ¹ | | net.Server.listen | O | O | △ ¹ | △ ¹ | | net.Server.close | O | O | △ ²| O | | net.Socket.connect | O | O | △ ¹ | △ ¹ | | net.Socket.write | O | O | △ ¹ | △ ¹ | | net.Socket.end | O | O | △ ¹ ³ | △ ¹ ³ | | net.Socket.destroy | O | O | △ ¹ ³ | △ ¹ ³ | | net.Socket.pause | O | O | △ ¹ | △ ¹ | | net.Socket.resume | O | O | △ ¹ | △ ¹ | | net.Socket.setTimeout | O | O | △ ¹ | △ ¹ | | net.Socket.setKeepAlive | X | X | X | X | 1. On NuttX/STM32F4-Discovery and TizenRT/Artik053, even a couple of sockets/server/requests might not work properly. 2. On NuttX/STM32F4-Discovery, close() may block due to a bug in poll(). 3. When writable stream is finished but readable stream is still alive, IoT.js tries to shutdown the socket, not destroy. However on `NuttX` and `TizenRT` due to lack of implementation, it does nothing inside. # Net IoT.js provides asynchronous networking through Net module. You can use this module with `require('net')` and create both servers and clients. ### net.connect(options[, connectListener]) * `options` {Object} An object which specifies the connection options. * `connectListener` {Function} Listener for the `'connect'` event. * Returns {net.Socket}. Creates a new `net.Socket` and automatically connects with the supplied `options`. The `options` object specifies the following information: * `port` {number} Port connect to (required). * `host` {string} Host connect to (optional, **Default:** `localhost`). * `family` {number} Version of IP stack. The `options` are passed to both the `net.Socket` constructor and the `socket.connect` method. The `connectListener` is automatically registered as a `'connect'` event listener. **Example** ```js var net = require('net'); var port = 22702; var echo_msg = ''; var socket = net.connect({port: port, family: 4}, function() { socket.end('Hello IoT.js'); }); socket.on('data', function(data) { echo_msg += data; }); socket.on('end', function() { console.log(echo_msg); }); ``` ### net.connect(port[, host][, connectListener]) * `port` {number} Port the client should connect to. * `host` {string} Host the client should connect to. **Default:** `localhost`. * `connectListener` {Function} Listener for the `'connect'` event. * Returns {net.Socket}. Creates a new `net.Socket` and automatically connects to the supplied `port` and `host`. If host is omitted, `localhost` will be assumed. The `connectListener` is automatically registered as a `'connect'` event listener. **Example** ```js var net = require('net'); var port = 22702; var host = '127.0.0.1'; var echo_msg = ''; var socket = net.connect(port, host, function() { socket.end('Hello IoT.js'); }); socket.on('data', function(data) { echo_msg += data; }); socket.on('end', function() { console.log(echo_msg); }); ``` ### net.createConnection(options[, connectListener]) * `options` {Object} An object which specifies the connection options. * `connectListener` {Function} Listener for the `'connect'` event. * Returns {net.Socket}. Creates a new `net.Socket` and automatically connects with the supplied `options`. The `options` are passed to both the `net.Socket` constructor and the `socket.connect` method. The `options` object specifies the following information: * `port` {number} Port connect to (required). * `host` {string} Host connect to (optional, **Default:** `localhost`). * `family` {number} Version of IP stack. The `connectionListener` is automatically registered as a `'connect'` event listener. **Example** ```js var net = require('net'); var port = 80; var echo_msg = ''; var socket = net.createConnection({port: port, family: 4}, function() { socket.end('Hello IoT.js'); }); socket.on('data', function(data) { echo_msg += data; }); socket.on('end', function() { console.log(echo_msg); }); ``` ### net.createConnection(port[, host][, connectListener]) * `port` {number} Port the client should connect to. * `host` {string} Host the client should connect to. **Default:** `localhost`. * `connectListener` {Function} Listener for the `'connect'` event. * Returns {net.Socket}. Creates a new `net.Socket` and automatically connects to the supplied `port` and `host`. It is equivalent to `new net.Socket()` followed by `socket.connect()`. If host is omitted, `localhost` will be assumed. The `connectionListener` is automatically registered as a `'connect'` event listener. **Example** ```js var net = require('net'); var port = 22702; var host = '127.0.0.1'; var echo_msg = ''; var socket = net.createConnection(port, host, function() { socket.end('Hello IoT.js'); }); socket.on('data', function(data) { echo_msg += data; }); socket.on('end', function() { console.log(echo_msg); }); ``` ### net.createServer([options][, connectionListener]) * `options` {Object} An object which specifies the connection options **Default:** `{ allowHalfOpen: false }`. * `connectListener` {Function} Listener for the `'connection'` event. * Returns {net.Server}. Creates a TCP server according to `options`. The `connectionListener` is automatically registered as a `'connection'` event listener. If `allowHalfOpen` is true, then the socket becomes non-readable, but still writable. You should call the `socket.end()` method explicitly. **Example** ```js var net = require('net'); var port = 22702; var server = net.createServer( { allowHalfOpen: true }, function(socket) { server.close(); } ); server.listen(port); server.on('connection', function(socket) { var msg = ''; socket.on('data', function(data) { msg += data; }); socket.on('end', function() { socket.end(msg); }); }); ``` ## Class: net.Server This class is used to create a TCP or local server. You can create `net.Server` instance with `net.createServer()`. ### server.close([closeListener]) * `closeListener` {Function} Listener for the `'close'` event. Stops listening new arriving connection. Server socket will be finally closed when all existing connections are closed, then emits `'close'` event. The `closeListener` is registered as a `'close'` event listener. **Example** ```js var net = require('net'); var server = net.createServer(); var port = 22704; var timeout = 1000; server.listen(port); /* ... */ server.close(); ``` ### server.listen(port[, host][, backlog][, listenListener]) * `port` {number} Port the client should connect to. * `host` {string} Host the client should connect to. * `backlog` {number} The maximum length of the queue of pending connections. **Default:** `511`. * `listenListener` {Function} Listener for the `'listening'` event. * Returns: {Object} The self instance of `net.Server`. Begin accepting connections on the specified port and hostname. If the hostname is omitted, the server will accept connections on any IPv4 address (0.0.0.0). **Example** ```js var net = require('net'); var server = net.createServer(); var port = 22709; server.listen(port); ``` ### server.listen(options[, listenListener]) * options {Object} An object which specifies the connection options. * `listenListener` {Function} Listener for the `'listening'` event. It behaves as the `server.listen(port[, host][, backlog][, listenListener])` function above. The option object supports the following properties: * `port` {number} Port the client should connect to. * `host` {string} Host the client should connect to. * `backlog` {number} The maximum length of the queue of pending connections. **Default:** `511`. **Example** ```js var net = require('net'); var server = net.createServer(); server.listen({port: 80, host: 'localhost'}); ``` ### Event: 'close' * `callback` {Function} Emitted when server has closed the connection. Note that this event will be emitted after all existing connections are closed. **Example** ```js var net = require('net'); var serverCloseEvent = 0; var server = net.createServer(); var port = 80; server.listen(port); server.on('connection', function(socket) { server.on('close', function() { serverCloseEvent++; }); }); ``` ### Event: 'connection(socket)' * `callback` {Function} * `socket` {Net.Socket} Emitted when new connection is established. **Example** ```js var net = require('net'); var server = net.createServer(); var port = 80; server.listen(port); server.on('connection', function(socket) { var msg = ''; socket.on('data', function(data) { msg += data; }); }); ``` ### Event: 'error' * `callback` {Function} Emitted when an error occurs. **Example** ```js var assert = require('assert'); var net = require('net'); var port = 80; var msg = 'Hello IoT.js'; var server = net.createServer(); /* ... */ server.on('error', function() { assert.fail(); server.close(); }); ``` ### Event: 'listening' * `callback` {Function} Emitted when server has been started listening. **Example** ```js var net = require('net'); var port = 80; var server = net.createServer( { allowHalfOpen: true }, function(socket) { server.close(); } ); server.listen(port); server.on('listening', function() { console.log('started listening'); }); ``` ## Class: net.Socket This object is an abstraction of a TCP or a local socket. `net.Socket` inherits from [`Stream.Duplex`](IoT.js-API-Stream.md). They can be created by the user (used as a client with connect()) or by the IoT.js engine (passed to the user through the 'connection' event of a server). ### new net.Socket([options]) * `options` {Object} An optional object which specifies the socket information. * Returns {net.Socket}. Construct a new socket object. The `options` object specifies only the following information: `allowHalfOpen` {boolean}. **Example** ```js var net = require('net'); var socket = new net.Socket(); ``` ### socket.connect(options[, connectListener]) * `options` {Object} An object which specifies the connection information. * `connectListener` {Function} Listener for the `'connect'` event. * Returns {net.Socket}. Creates a new socket object and automatically connects with the supplied `options`. The `options` object specifies following information: * `port` {number} Port connect to (required). * `host` {string} Host connect to (optional, **Default:** `localhost`). * `family` {number} Version of IP stack. The `connectionListener` is automatically registered as a `'connect'` event listener which will be emitted when the connection is established. **Example** ```js var net = require('net'); var port = 22702; var socket = new net.Socket(); socket.connect({port: port, family: 4}, function() { socket.end('Hello IoT.js'); }); ``` ### socket.connect(port[, host][, connectListener]) * `port` {number} Port the client should connect to. * `host` {string} Host the client should connect to. **Default:** `localhost`. * `connectListener` {Function} Listener for the `'connect'` event. * Returns {net.Socket}. Creates a new socket and automatically connects with the supplied `port` and `host`. `connectionListener` is automatically registered as a `'connect'` event listener which will be emitted when the connection is established. **Example** ```js var net = require('net'); var port = 80; var socket = new net.Socket(); socket.connect(port, '127.0.0.1', function() { socket.end('Hello IoT.js'); }); ``` ### socket.destroy() Ensures that no more I/O activity happens on the socket and destroys the socket as soon as possible. **Example** ```js var net = require('net'); var port = 80; var socket = new net.Socket(); socket.connect(port, '127.0.0.1', function() { socket.end('Hello IoT.js'); }); /* ... */ socket.destroy(); ``` ### socket.end([data][, callback]) * `data` {Buffer|string} * `callback` {Function} Half-closes the socket. The socket is no longer writable. If `data` is given it is equivalent to `socket.write(data)` followed by `socket.end()`. **Example** ```js var net = require('net'); var server = net.createServer(); var port = 4010; server.listen(port); server.on('connection', function(socket) { socket.on('data', function(data) { socket.end('Hello IoT.js'); }); }); ``` ### socket.pause() Pauses reading data. **Example** ```js var net = require('net'); var server = net.createServer(); var port = 4010; server.listen(port); server.on('connection', function(socket) { // as soon as connection established, pause the socket socket.pause(); }); ``` ### socket.resume() Resumes reading data after a call to `pause()`. **Example** ```js var net = require('net'); var timers = require('timers'); var server = net.createServer(); var port = 80; var socket = new net.Socket(); var msg = ""; /* ... */ server.listen(port); server.on('connection', function(socket) { socket.on('data', function(data) { msg += data; socket.end(); }); socket.on('close', function() { server.close(); }); // as soon as connection established, pause the socket socket.pause(); // resume after 2 secs timers.setTimeout(function() { socket.resume(); }, 2000); }); ``` ### socket.setKeepAlive([enable][, initialDelay]) * `enable` {boolean} **Default:** `false`. * `initialDelay {number} **Default:** `0`. Enables or disables keep-alive functionality. **Example** ```js var net = require('net'); var keepalive_sock = new net.Socket(); keepalive_sock.setKeepAlive(true, 1000); ``` ### socket.setTimeout(timeout[, callback]) * `timeout` {number} Timeout number. * `callback` {Function} Registered as a `'timeout'` event listener. Sets timeout for the socket. If the socket is inactive for `timeout` milliseconds, `'timeout'` event will emit. **Example** ```js var net = require('net'); var server = net.createServer(); var port = 40; var timeout = 2000; var msg = ''; server.listen(port); server.on('connection', function(socket) { socket.setTimeout(timeout, function() { socket.end(); }); }); ``` ### socket.write(data[, callback]) * `data` {Buffer|string} Data to write. * `callback` {Function} Executed function (when the data is finally written out). Sends `data` on the socket. The optional `callback` function will be called after the given data is flushed through the connection. **Example** ```js var net = require('net'); var timers = require('timers'); var writeat = 1000; var socket = new net.Socket(); /* ... */ socket.on('connect', function() { timers.setTimeout(function() { socket.write('Hello IoT.js'); }, writeat); }); ``` ### Event: 'connect' * `callback` {Function} Emitted after connection is established. **Example** ```js var net = require('net'); var port = 80; var count = 40; /* ... */ for (var i = 0; i < count; ++i) { (function(i) { var socket = new net.Socket(); socket.connect(port, "localhost"); socket.on('connect', function() { socket.end(i.toString()); }); /* ... */ })(i); } ``` ### Event: 'close' * `callback` {Function} Emitted when the socket has been closed. **Example** ```js var net = require('net'); var server = net.createServer(); var port = 80; server.listen(port); server.on('connection', function(socket) { /* ... */ socket.on('close', function() { server.close(); }); }); ``` ### Event: 'data' * `callback` {Function} The data is given an argument (data: Buffer|string). Emitted when data is received from the connection. **Example** ```js var net = require('net'); var msg = ""; var socket = new net.Socket(); /* ... */ socket.on('data', function(data) { msg += data; }); ``` ### Event: 'drain' * `callback` {Function} Emitted when the write buffer becomes empty. **Example** ```js var net = require('net'); var port = 22703; var limit = 200; var server = net.createServer(); server.listen({ port: port }); /* ... */ server.on('connection', function(socket) { var i = 0; var writing = function() { var ok; do { ok = socket.write("" + (i % 10)); if (++i == limit) { socket.end(); ok = false; } } while (ok); }; socket.on('drain', writing); writing(); }); ``` ### Event: 'end' * `callback` {Function} Emitted when FIN packet received. **Example** ```js var net = require('net'); var socket = new net.Socket(); /* ... */ socket.on('end', function() { socket.end(); }); ``` ### Event: 'error' * `callback` {Function} * `err` {Error} Emitted when an error occurs. **Example** ```js var assert = require('assert'); var net = require('net'); var bad_sock = new net.Socket(); bad_sock.on('error', function(err){ assert.equal(err instanceof Error, true); }); ``` ### Event: 'lookup' * `callback` {Function} * `err` {Error} * `address` {string} * `family` {string|null} Emitted after resolving hostname. **Example** ```js var socket = new net.Socket(); var msg = ""; var lookupHandled = false; socket.on('lookup', function(err, ip, family) { lookupHandled = true; }); ``` ### Event: 'timeout' * `callback` {Function}` Emitted when the connection remains idle for the specified timeout. **Example** ```js var net = require('net'); var timedout = false; // Try connect to host that is not exist (Reserved address) var socket = net.createConnection(11111, '192.0.2.1'); socket.setTimeout(1000); socket.on('timeout', function() { timedout = true; socket.destroy(); }); ```