javascript - 将 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');
});
});
});
解决方案
推荐阅读
- php - Sparkling Theme 与 PHP-8 不兼容
- sql - 如何在聚合和非聚合数据集上获得相同的 AVG() 值
- flutter - Flutter 对话框根据内容调整大小并在内容过长时滚动
- arduino - ADXL345 与 ESP32 I2C 垃圾值问题
- python - 将数字图像转换为 numpy 数组的问题
- mysql - 从具有特定标志mysql的辅助表中获取记录
- javascript - 创建模因并存储到本地
- oracle - 具有多个表和 where 条件的 Logstash jdbc 语句
- flutter - Flutter:如何使用钩子来改变 textformfield 中文本的可见性?
- amazon-web-services - 如何通过 StatusCheckFailed_Instance 指标使用 Cloudwatch 警报恢复 EC2(不是 StatusCehckFailed_System 指标!!!)