# tcp-base A base class for tcp client with basic functions [![NPM version][npm-image]][npm-url] [![Node.js CI](https://github.com/node-modules/tcp-base/actions/workflows/nodejs.yml/badge.svg)](https://github.com/node-modules/tcp-base/actions/workflows/nodejs.yml) [![Test coverage][codecov-image]][codecov-url] [![npm download][download-image]][download-url] [npm-image]: https://img.shields.io/npm/v/tcp-base.svg?style=flat-square [npm-url]: https://npmjs.org/package/tcp-base [codecov-image]: https://codecov.io/gh/node-modules/tcp-base/branch/master/graph/badge.svg [codecov-url]: https://codecov.io/gh/node-modules/tcp-base [download-image]: https://img.shields.io/npm/dm/tcp-base.svg?style=flat-square [download-url]: https://npmjs.org/package/tcp-base ## Install ```bash npm install tcp-base --save ``` Node.js >= 6.0.0 required ## Usage A quick guide to implement a tcp echo client Client: ```js 'use strict'; const TCPBase = require('tcp-base'); /** * A Simple Protocol: * (4B): request id * (4B): body length * ------------------------------ * body data */ class Client extends TCPBase { getHeader() { return this.read(8); } getBodyLength(header) { return header.readInt32BE(4); } decode(body, header) { return { id: header.readInt32BE(0), data: body, }; } // heartbeat packet get heartBeatPacket() { return new Buffer([ 255, 255, 255, 255, 0, 0, 0, 0 ]); } } const client = new Client({ host: '127.0.0.1', port: 8080, }); const body = new Buffer('hello'); const data = new Buffer(8 + body.length); data.writeInt32BE(1, 0); data.writeInt32BE(body.length, 4); body.copy(data, 8, 0); client.send({ id: 1, data, timeout: 5000, }, (err, res) => { if (err) { console.error(err); } console.log(res.toString()); // should echo 'hello' }); ``` Server: ```js 'use strict'; const net = require('net'); const server = net.createServer(socket => { let header; let bodyLen; function readPacket() { if (bodyLen == null) { header = socket.read(8); if (!header) { return false; } bodyLen = header.readInt32BE(4); } if (bodyLen === 0) { socket.write(header); } else { const body = socket.read(bodyLen); if (!body) { return false; } socket.write(Buffer.concat([ header, body ])); } bodyLen = null; return true; } socket.on('readable', () => { try { let remaining = false; do { remaining = readPacket(); } while (remaining); } catch (err) { console.error(err); } }); }); server.listen(8080); ``` [MIT](LICENSE)