2012-01-20 28 views
20

Giả sử một máy chủ được tạo ra như:Làm cách nào để dừng máy chủ node.js mà không làm hỏng quy trình?

var net = require('net'); 

var server = net.createServer(); 
server.listen(32323, '127.0.0.1'); 

server.close(); // gives a "not running" error if there is IP in the listen statement 

là Có cách nào để ngăn chặn nó từ Node.js, ví dụ mà không kết thúc/giết chết toàn bộ quá trình?

Ngoài ra, đây là một ví dụ phức tạp hơn mà không dừng lại không phụ thuộc vào IP máy chủ được liên kết với:

var net = require('net'); 

var server = net.createServer(function(socket) { 
    socket.on('data', console.log); 
    server.close(); 
}); 

server.listen(32323); 

var socket = net.createConnection(32323); 
socket.write('hi'); 

Trả lời

20

server.close

Đừng gọi gần trước "listening" kiện cháy.

Hoặc thêm một callback để listen hoặc thêm một sự kiện bằng tay

server.listen(port, host, function() { server.close(); }); 
// OR 
server.on("listening", function() { server.close(); }); 
server.listen(port, host); 

var net = require('net'); 

var server = net.createServer(function(socket) { 
    socket.on('data', console.log); 
    server.close(); 
}); 

server.listen(32323); 

var socket = net.createConnection(32323); 
// call end to make sure the socket closes 
socket.end('hi'); 
+0

Strange, thời gian trước đó tôi đã cố gắng này, tôi đã nhận ra lỗi – Fluffy

+0

Này, tôi nhận được rằng một lần nữa, xin vui lòng xem cập nhật – Fluffy

+0

@Fluffy thấy chỉnh sửa – Raynos

3

Bỏ qua đến lần thứ 2, trường hợp thực tế hơn: đóng kết nối hiện trước khi gọi server.close:

var net = require('net') 

var server = net.createServer(function(socket){ 
    socket.on('data', function(data){ 
     console.log(data.toString()) 
     socket.destroy() 
     server.close() 
    }) 
}) 

server.listen(32323) 

Lưu ý rằng nếu bạn không có bất kỳ trường hợp máy chủ hoặc hoạt động nào khác đang diễn ra trong quá trình này, nó sẽ thoát sau khi đóng server.

2

Nếu đó là một HTTP hoặc HTTPS server, nó giúp nếu bạn đóng socket được yêu cầu như sau:

function onRequest(request, response) { 
    response.end(); //close the response 
    request.connection.end(); //close the socket 
    request.connection.destroy; //close it really 
    server.close(); //close the server 
} 

server.on("request", onRequest); 
server.on("close", function() {console.log("closed");}); 

server.listen(port, host); 

Hy vọng rằng sẽ giúp.

0

Dưới đây là ví dụ minh họa những gì tôi nghĩ bạn đang theo dõi.

var net = require('net'); 


var server = net.createServer(function (socket) { 
    socket.on('data', function (data) { 
    console.log("server got data " + data.toString()); 

    }); 
}); 

function startServer() { 
    server.listen(32323, function() { 
    console.log('server started'); 
    }); 
} 

function stopServer() { 
    server.close(function() { 
    console.log('server stopped'); 
    }); 
} 

setInterval(function() { 

    if (server.address()) { 
    console.log("Server is running on port " + server.address().port + " let's kill it."); 
    stopServer(); 
    } else { 
    console.log("Server is stopped let's start it."); 
    startServer(); 
    } 

}, 10000); 


setInterval(function() { 

    var socket = net.createConnection(32323, function() { 
    socket.write('hi'); 
    }); 
    socket.on('error', function (e) { 
    console.log(e.message); 
    }); 


}, 1000); 

startServer(); 
0

server.close() ngăn chặn các kết nối mới và chờ đợi cho đến khi tất cả các khách hàng đều đóng cửa.

Để cưỡng bức tiêu diệt một máy chủ nút, bạn cần gọi server.close() và sau đó đóng tất cả các kết nối đang mở từ cuối máy chủ.

Khi khách hàng kết nối theo dõi ổ cắm.

var sockets = [] 

var server = net.createServer((socket) => { 
    sockets.push(socket) 
}) 

Để buộc giết ...

server.close() 
sockets.forEach((s) => s.end()) 
Các vấn đề liên quan