代码之家  ›  专栏  ›  技术社区  ›  muliku

NodeJS网络模块-再次调用时不要尝试创建TCP服务器的另一个实例

  •  0
  • muliku  · 技术社区  · 7 年前

    我对整个nodeJS asynchronous-y callback-y编程都是新手,所以我需要更多的指导来理解我在做什么。话虽如此,我有两个文件 主要的js公司 服务器js公司

    我的主文件如下所示:

    var server=require('./server.js');
    
    server();
    
    function WhenUserClicksButton(){
       server();
    }
    

    我的服务器文件如下所示:

    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);
    }
    

    的第一次调用 server(); 启动TCP服务器。Then函数 WhenUserClicksButton 当用户单击GUI中的按钮(duhh)时调用。但它试图再次启动服务器

    错误:listen EADDRINUSE::33333

    我知道为什么会这样,但我想不出解决办法。我真正需要的是:

    1. 启动服务器并在33333上侦听

    2. 当什么都没有发生时,服务器和客户端只需每隔几秒钟交换一次SYN和ACK字符(我已经完成了这一部分,为了清晰起见,我只是从这个示例中删除了它,因为它不是这个问题的真正主题)

    3. 当用户单击按钮更改时 socket.write('\x16'); socket.write('something');

    4. 然后等待服务器和客户端交换数据,完成所有操作后将结果返回给 主要的js公司

    正如我所说,我对这一点还不熟悉,我相信我的问题在于没有完全理解我在做什么。欢迎任何帮助和解释!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Terry Lennox    7 年前

    我想你离你需要的地方很近了。我会这样做:

    服务器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
    };
    

    主要的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');
    });