【问题标题】:Node.js connect to tcp socket after rendering expressNode.js 在渲染 express 后连接到 tcp 套接字
【发布时间】:2018-05-02 14:07:49
【问题描述】:

我制作 node.js web 服务器和 tcp 客户端和 java tcp 服务器。 (仅用于学习套接字和Web编程)我想制作用户连接到网页并输入一些信息的程序,然后节点将数据发送到java tcp服务器并获取回显数据,最后将数据渲染到网页。

我的问题是节点首先呈现网页并将数据发送到 java tcp 服务器。我想按顺序制作。我该如何解决?

这是我的代码

var net = require('net');
var rcvData;
var socket;

function getConnection(connName) {
    var client = net.connect({ port: 5000, host: '127.0.0.1' }, function () {
        console.log(connName + ' Connected: ');
        console.log('   local = %s:%s', this.localAddress, this.localPort);
        console.log('   remote = %s:%s', this.remoteAddress, this.remotePort);
        this.setEncoding('utf8');

        this.on('data', function (data) {
            rcvData = JSON.parse(data);
            console.log("From Server: " + rcvData.year);
            this.end();
        });

        this.on('end', function () {
            console.log(connName + ' Client disconnected');
        });
        this.on('error', function (err) {
            console.log('Socket Error: ', JSON.stringify(err));
        });
        this.on('timeout', function () {
            console.log('Socket Timed Out');
        });
        this.on('close', function () {
            console.log('Socket Closed');
        });
    });
    return client;
}

function writeData(socket, data) {
    var success = !socket.write(data);
    if (!success) {
        (function (socket, data) {
            socket.once('drain', function () {
                writeData(socket, data);
            });
        })(socket, data);
    }
}

// http server
var promise = require('promise');
var express = require('express');
var app = express();
var path = require('path');
var bodyParser = require('body-parser');
var futures = require('futures');
var sequence = futures.sequence();

app.locals.pretty = true;

app.set('view engine', 'pug');
app.set('views', path.join(__dirname, 'views'));

app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));

app.get('/', function (req, res) {
    res.render('index');
});

app.listen(8080, function () {
    console.log('http server> listening on port 8080...');

});

app.post('/result', function (req, res) {
    sequence
        .then(function(next) {
            socket = getConnection("Java TCP Server");
            next(null, 1);
        })
        .then(function (next) {
            var jsonData = {
                name: req.body.name,
                year: req.body.year
            };
            writeData(socket, JSON.stringify(jsonData));
            next(null, 2);
        })
        .then(function (next) {
            console.log('render function enter');
            console.log('rcvData : ' + rcvData);
            res.render('result', {
                name: rcvData.name,
                year: rcvData.year
            });
            next(null, 4);
        });
});

【问题讨论】:

    标签: javascript node.js express tcp


    【解决方案1】:

    来自节点 api https://nodejs.org/api/net.html#net_socket_write_data_encoding_callback 以及需要注意的地方

    可选的回调参数将在数据被执行时执行 终于写出来了——这可能不会马上写出来。

    或者我可以简单地说 socket.write 是一个异步函数,你期望它同步。
    还检查参考Node.js flush socket after write 现在我只修改了一段代码,现在试试吧

      ........
    
       .then(function (next) {
                var jsonData = {
                    name: req.body.name,
                    year: req.body.year
                };
               socket.once('drain', function () {
                   socket.write(jsonData, (done)=>{
                    console.log(done0);
                    next(null, 2);
                   });
                });
    
            })
      ..........
    

    【讨论】:

    • 感谢您的回答。我认为这个问题也发生在套接字连接中。所以,页面没有呈现。
    • 啊,我解决了。我必须发送转义字符,因为 java 按行接收数据....这是我的错误
    • 哦,我忘了说“你必须发送转义字符,因为 java 是按行接收数据”,曾经这个问题也让我很沮丧。
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 2023-03-21
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多