Node.js 节点JS执行了两次函数

Node.js 节点JS执行了两次函数,node.js,Node.js,在stackoverflow上新建,在节点上新建 我有一个简单的套接字服务器和一个web服务器 如果有人连接了web服务器,我希望web服务器向套接字服务器发送消息 浏览器Web服务器/套接字客户端套接字服务器 我创建了如下服务器: var http = require('http'); var net = require('net'); var HOST = '192.168.1.254'; var PORT = 8888; var client = new net.Socket(); ht

在stackoverflow上新建,在节点上新建

我有一个简单的套接字服务器和一个web服务器

如果有人连接了web服务器,我希望web服务器向套接字服务器发送消息

浏览器Web服务器/套接字客户端套接字服务器

我创建了如下服务器:

var http = require('http');
var net = require('net');
var HOST = '192.168.1.254';
var PORT = 8888;
var client = new net.Socket();

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n', function(){
      client.connect(PORT, HOST, function() {
        console.log('Connected To: ' + HOST + ':' + PORT);
        client.write('0109001' + "\n");
      });   

    // Add a 'data' event handler for the client socket
    // data is what the server sent to this socket
        client.on('data', function(data) {
            console.log('The Data: ' + data);
            client.destroy();
        });

        // Add a 'close' event handler for the client socket
        client.on('close', function() {
            console.log('Connection closed');
        });
  });
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
此代码可以工作,但web服务器会将消息发送到套接字服务器两次。 我有没有做错什么,可能是回电话什么的? 任何帮助都将不胜感激。

客户端.on()调用不应该在
res.end()
回调中-这会导致事件处理程序被附加多次,这意味着每次接收数据时,它都会被多次调用

请尝试以下方法:

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n', function(){
      client.connect(PORT, HOST, function() {
        console.log('Connected To: ' + HOST + ':' + PORT);
        client.write('0109001' + "\n");
      });   
  });
}).listen(1337, '127.0.0.1');

// Add a 'data' event handler for the client socket
// data is what the server sent to this socket
client.on('data', function(data) {
    console.log('The Data: ' + data);
    client.destroy();
});

// Add a 'close' event handler for the client socket
client.on('close', function() {
    console.log('Connection closed');
});

如果您通过浏览器调用此代码,它将向服务器发送2个请求。一个用于FavIcon,另一个用于页面本身

回调中的代码被调用两次,因为有2个请求

正如Matt提到的:不要将套接字响应处理程序放在回调中,因为您会丢失对它们的引用,并且每个请求都会附加一个新的处理程序

var http = require('http');
var net = require('net');
var HOST = '192.168.1.254';
var PORT = 8888;
var client = new net.Socket();
var url   = require('url');

http.createServer(function (req, res) {
  console.log(url.parse(req.url));
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n', function(){

        console.log('Connected To: ' + HOST + ':' + PORT);

  });
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

您确定只发送一个请求吗?别忘了每个浏览器都有favicon请求。它是否每次都输出相同的URL?您确定这是问题所在吗?我想每一个请求都会附上它。这是一个僵尸处理程序,但我认为它不会导致套接字连接的另一台服务器上出现2个请求的问题to@pfried我想你可能是对的……既然你提到了它,似乎套接字只是由客户端写入的Line我忘了浏览器中的http头包含favicon请求:)感谢您指出将事件处理程序放置在回调外部这是您可以忽略favicon请求的方法,至少在调试时是这样的:您对favicon的看法是正确的,我忘了浏览器中的http头包含favicon请求:),无论如何,感谢您向我指出引用问题。上面的代码仍然给出了两个响应console@MohammadShahnawaz当然了,因为有两个请求,这不是重点