如何使一个node.js应用程序在closures套接字后保持监听?

我试图build立一个node.js应用程序,可以接收连接,并且一旦套接字结束,仍然在监听端口9001。 我怎样才能做到这一点? 这里是我当前的代码(它不会在socket.end()之后closures,但不会接受任何其他连接):

var net = require('net'); var mySocket; var server = net.createServer(function(socket) { mySocket = socket; mySocket.on("connect", onConnect); mySocket.on("data", onData); }); function onConnect() { console.log("Connected"); } function onData(command) { if (command == "exit") { console.log("Exiting"); mySocket.end(); } } console.log("Waiting for incoming connections"); server.listen(9001); 

我试图添加另一个server.listen(9001);socket.end(); ,但我得到一个: Error: listen EADDRINUSE消息。 另外,这段代码是否能够同时接收来自不同地址的多个连接,并分别处理?

这是完整的代码。 当执行时,node.js接收来自Flash应用程序的4个命令,并正常工作(除了onConnect()函数似乎永远不会被调用)和“退出”。 命令正确closures套接字,但是如果我重新加载Flash应用程序,它不会连接到服务器

 var net = require('net'); const PACKET_SEPARATOR = 59 // ; var connection_ack = false; var counter = 0; var server = net.createServer(function(socket) { function onConnect() { console.log("Connected to Flash"); } function dataHandler(command) { if (command[command.length - 1] != String.fromCharCode(PACKET_SEPARATOR) && connection_ack) { console.log("SEP : " + PACKET_SEPARATOR + " - last : " + command[command.length - 1] + " - ack " + connection_ack); console.log("CAUGHT EXCEPTION : WRONG PACKET FORMAT --- " + command + " --- " + command.length); } if (command == "exit;") { console.log("Received exit request from " + socket.address().address + ":" + socket.address().port + " (" + socket.address().family + "). Ending connection..."); socket.end(); } else if (command == "<policy-file-request/>\0") { socket.write('<cross-domain-policy>\n<allow-access-from domain="*" to-ports="*" />\n</cross-domain-policy>\0', 'utf8'); console.log("Policy file sent to " + socket.address().address + ":" + socket.address().port); player1.pxacceleration = 0; player1.pyacceleration = 0; connection_ack = true; } else { console.log("Got data from " + socket.address().address + ":" + socket.address().port + " (" + socket.address().family + ")"); console.log("--> " + command); counter++; socket.write("Received " + counter + " commands;", 'utf8'); console.log("Sending : Received " + counter + " commands;"); } } function onData(d) { var command = ""; for (i=0; i <= d.length - 1; i++) { command += String.fromCharCode(d[i]); if (d[i] == PACKET_SEPARATOR || i == d.length - 1 && !connection_ack) { dataHandler(command); command = ""; } } } socket.on("connect", onConnect); socket.on("data", onData); }); console.log("Ready. Waiting for incoming connections"); server.listen(9001); server.listen(80); //TODO : Remove? 

正如jfriend00所说,不推荐使用mySocket作为全局。 尝试下面的代替。

 var server = net.createServer(function(socket) { function onData(command) { if (command == "exit") { console.log("Exiting"); socket.end(); } } socket.on("connect", onConnect); socket.on("data", onData); }); ... 

这首先消除了对全球的需求。 这也应该允许多个套接字,并防止原来的错误。 我认为。 我是新来的,所以我想我们会看到的。

编辑好的。 我一直在通过telnet与你的代码进行交互。 我也阅读了一些文档。 首先, socket.on("connect", onConnect); 应该将监听器(连同onConnect函数一起)移动到全局作用域中并更改为server.on("connection", onConnect); 。 原因是套接字事件侦听器connect是一个客户端侦听器。 我们正在服务器端。 新连接的服务器端监听器是connection ,服务器应该以监听特定端口连接的方式监听它。

你的代码的这部分应该看起来像这样:

 //more code up above here .... function onData(d) { var command = ""; for (i=0; i <= d.length - 1; i++) { command += String.fromCharCode(d[i]); if (d[i] == PACKET_SEPARATOR || i == d.length - 1 && !connection_ack) { dataHandler(command); command = ""; } } } socket.on("data", onData); }); function onConnect() { console.log("Connected to Flash"); } server.on("connection", onConnect); .... //more code below here 

但是,代码无法通过telnet将其识别为命令。 我无法理解这一点。 由于你的问题没有涵盖这个问题,它可能只是我或你已经想通了。

编辑2下面的代码保持本地。

 var server = net.createServer(function(socket) { function onConnect() { console.log("Connected to Flash"); socket.write("we're connected"); } .... function onData(d) { var command = ""; for (i=0; i <= d.length - 1; i++) { command += String.fromCharCode(d[i]); if (d[i] == PACKET_SEPARATOR || i == d.length - 1 && !connection_ack) { dataHandler(command); command = ""; } } } onConnect(); socket.on("data", onData); });