首页 > 解决方案 > 将 http 响应与套接字连接同步

问题描述

我正在使用带有套接字连接的http服务器,当http请求命中时,套接字连接向不同的客户端发送消息,该客户端在此http响应之后执行http请求,客户端回复消息并发送初始http请求的响应。我的问题是第一次http请求有时会成功响应,有时不会,我认为有同步问题,如何解决。

用于创建套接字和 httpserver 的代码 -

const app = require('express')()
bodyParser = require('body-parser')
app.use(bodyParser.json())
const net = require('net');
var client;
var res1,currentReq;

//----------------------------------------------------------------------------
// http requests listener
//----------------------------------------------------------------------------

app.listen(8001, () => console.log('Http server listening on port 8001'));

//----------------------------------------------------------------------------
// http requests handling
//----------------------------------------------------------------------------

app.post('/makeCall', (req, res) => {
        console.log('sd' + req.body)
        res1 = res;
        currentReq='makeCall';
        console.log('{"route":"/api/makeCall","data":{"product_id":"'  + req.body.product_id + '","destination":"' + req.body.destination + '"}}');
        client.write('{"route":"/api/makeCall","data":{"product_id":"'  + req.body.product_id + '","destination":"' + req.body.destination + '"}}');

});

//----------------------------------------------------------------------------
// Establishing tcp connection for incoming requests
//----------------------------------------------------------------------------

var server = net.createServer(function(connection) {
   console.log ('client has connected successfully!');
   client = connection;
   client.on('data',function(data){
   switch(currentReq) 
   {
       case 'makeCall' :
                    console.log('send make call response');
                    res1.end(data);
                    break;

   }

    console.log(data.toString());
            //res1.end(data);

  });

   connection.pipe(connection);
});


//----------------------------------------------------------------------------
// listener for tcp connections
//----------------------------------------------------------------------------

server.listen(8000, function() {
   console.log('server for localhost is listening on port 8000');
   console.log('server bound address is: ' + server.address ());
});

套接字连接到的客户端的代码 -

tcpClient.on('connect',function(){
    logger.info("[%s] , Connected to the server at %s:%s",__file,CONFIG.tcp_server_host,CONFIG.tcp_server_port);
    logger.info("[%s] , TCP client info %s",__file,tcpClient.address().address);
});

//  Handle data event
tcpClient.on('data',function(data){
    logger.info('[%s] , Data recevied',__file);

    // Convert the Buffer to JSON object
    var reqInfo;
    reqInfo = JSON.parse(data.toString());

    if(reqInfo!=null){

        switch(reqInfo.route){

            case '/api/makeCall':;
            var product_id      = reqInfo.data.product_id;
            var destination = reqInfo.data.destination;
            var test = {};
            var source;
            var myJSONObject = {'product_id':product_id};

             MongoClient.connect(url, function(err, db) {
              var dbo = db.db("mapping");
              dbo.collection("mapping").findOne({"id":product_id},function(err,result)
              {
                if(err)
                {
                  throw err;
              }
      JSON.stringify(result);
      sourceDB = result.source;

        // Set the options for HTTPS request
        options.method              = "POST";
        options.url                 = "url";
        options.json                = true;
        options.auth                = {
            user: '123',
            password: '123'
        };
            options.body                = {"Source": sourceDB,"Destination": destination} ;
            logger.info('[%s] , HTTPS request options : %o',__file,options);
            request(options,function(error,res1,body){
             tcpClient.write('Sending data to Falcon');

            });

        });
  });


标签: javascriptnode.js

解决方案


推荐阅读