muliku
muliku

Reputation: 476

NodeJS net module - don't try to create another instance of TCP server when called again

I'm totally new to the whole nodeJS asynchronous-y callback-y programming so I need more like a guidance to understanding what I'm even doing. With that said, I have two files main.js and server.js

My main file looks like this:

var server=require('./server.js');

server();

function WhenUserClicksButton(){
   server();
}

and my server file looks like this:

var net = require('net');

function server(){
   net.createServer(function (socket) {

      socket.write('\x16');  //SYN character

      socket.on('data', function (data) {
         //handle data from client
      });
   }).listen(33333);
}

First call of server(); starts the TCP server. Then function WhenUserClicksButton is called when user clicks button (duhh) in a GUI. But it attempts to start the server again so I get

Error: listen EADDRINUSE :::33333

I got why this is happening but I can't think of a solution for it. What I really need is:

  1. Start the server and listen on 33333

  2. When nothing is happening server and client just exchanges SYN and ACK characters every few seconds (I already have this part done, I just removed it from this example for clarity because it's not really topic of this question)

  3. When user click button change socket.write('\x16'); to socket.write('something');

  4. Then wait for server and client to exchange data and after everything is done return results back to main.js

As I said, I'm new to this and I believe my problem lies in not understanding fully of what I'm doing. Any help and explanations are welcome!

Upvotes: 0

Views: 325

Answers (1)

Terry Lennox
Terry Lennox

Reputation: 30685

I think you're very near where you need to be. I would do something like this:

server.js

var net = require('net');

var netServer = null;
var netSocket = null;

function sendData(data) {
    if (netServer && netSocket) {
        console.log('Send data: sending: ', data);
        netSocket.write(data);
    }
}

function startServer(){
    netServer = net.createServer(function (socket) {

      netSocket = socket;
      socket.write('\x16');  //SYN character

      socket.on('data', function (data) {
         console.log('Server: data from client: ', data);
         if (data.length === 1 && data[0] === 0x16) {
             // log and ignore SYN chars..
             console.log('SYN received from client');
         } else if (newDataCallback) {
             newDataCallback(data);
         };
      });
   });

   console.log('Server listening on 33333..');
   netServer.listen(33333);
}

var newDataCallback = null;
function setNewDataCallback(callback) {
    newDataCallback = callback;
}

module.exports = {
    sendData: sendData,
    startServer: startServer,
    setNewDataCallback: setNewDataCallback
};

main.js

var server = require('./server');

function newDataCallback(data) {
    console.log('newDataCallback: New data from server: ', data);
}

server.setNewDataCallback(newDataCallback);
server.startServer();

function wheneverUserClicksButton()  {
    server.sendData('something');
}

testClient.js

var clientSocket = net.createConnection(33333, "127.0.0.1");

clientSocket.on('data', (someData) => {
  console.log('Data received', someData);  
});

clientSocket.on('connect', () => {
  console.log('Client Socket connected '); 
  clientSocket.write('Hello from client');
});

Upvotes: 1

Related Questions