Sebastian Seilund Sebastian Seilund

Need help with
a project?

Hire me!

Sending JSON over TCP in Node.js using sockets

Today I have released my first Node.js open source module on npm. It’s called json-socket.

It makes it easy to send JSON over TCP in Node.js using sockets.

Normally when you send data through sockets using Node’s net package, you need to worry about data chunking and multiple messages in one chunk. JsonSocket automatically takes care of all that for you.

JsonSocket works by decorating the built-in net.Socket class.

Here is a simple example where a client can connect to the server and send two numbers (a and b) that the server multiplies and sends back the result.

Server

var net = require('net'),
    JsonSocket = require('json-socket');

var port = 9838;
var server = net.createServer();
server.listen(port);
server.on('connection', function(socket) { //This is a standard net.Socket
    socket = new JsonSocket(socket); //Now we've decorated the net.Socket to be a JsonSocket
    socket.on('message', function(message) {
        var result = message.a + message.b;
        socket.sendEndMessage({result: result});
    });
});

Client

var net = require('net'),
    JsonSocket = require('json-socket');

var port = 9838; //The same port that the server is listening on
var host = '127.0.0.1';
var socket = new JsonSocket(new net.Socket()); //Decorate a standard net.Socket with JsonSocket
socket.connect(port, host);
socket.on('connect', function() { //Don't send until we're connected
    socket.sendMessage({a: 5, b: 7});
    socket.on('message', function(message) {
        console.log('The result is: '+message.result);
    });
});

Check out the readme on GitHub or install it directly using npm:

npm install json-socket

I’m going to use this module as a helper for another module that I have coming up. It’s a library that makes it easy to distribute workloads across multiple servers.

You’ll be able to write code like this:

var xxx = require('xxx'); //The new module

for (var someNumber = 1; someNumber < 100; someNumber++) {
    xxx.runFunction(performAdvancedCalculation, someNumber, function(err, result) {
        //result was calculated on another server than this one.
    });
}

function performAdvancedCalculation(someNumber, callback) {
    callback(null, somethingThatTakesUpAllCpuAndIsVeryIntensive(someNumber));
}

Which will run the function performAdvancedCalculation 100 times on different servers. All the other servers have to do is:

var xxx = require('xxx');
xxx.listen();

It’s a very handy functionality, and I use it with great success in one of my large scale Node.js projects.