📅  最后修改于: 2023-12-03 15:11:44.652000             🧑  作者: Mango
在开发 Node.js 应用时,经常需要使用网络相关的模块和技术。考察网络编程基础的问题如下:
下面的代码实现了一个服务端和一个客户端,服务端接收客户端的请求并返回一个响应。在客户端发起多个请求时,服务端只能响应一个请求,其它请求不会得到响应,最终导致客户端的 hang 住。请找出问题并解决。
服务端代码(server.js):
const net = require('net');
const server = net.createServer(socket => {
socket.write('Welcome to server!');
socket.on('data', data => {
console.log('Request:', data.toString());
setTimeout(() => {
socket.write(`Response: ${data}`);
}, 2000);
});
});
server.listen(3000, () => {
console.log('Server is running on port 3000.');
});
客户端代码(client.js):
const net = require('net');
const client = new net.Socket();
client.connect(3000, '127.0.0.1', () => {
console.log('Connected to server.');
client.write('Hello, server!');
});
client.on('data', data => {
console.log('Response:', data.toString());
});
问题出在服务端在处理请求时,使用了 setTimeout 来模拟异步操作,导致服务端无法同时响应多个请求。
解决方案是使用 Node.js 提供的异步编程模型来改写服务端代码,让服务端能够处理多个请求并同时响应。
改写后的服务端代码如下:
const net = require('net');
const server = net.createServer(socket => {
socket.write('Welcome to server!');
socket.on('data', data => {
console.log('Request:', data.toString());
setImmediate(() => {
socket.write(`Response: ${data}`);
});
});
});
server.listen(3000, () => {
console.log('Server is running on port 3000.');
});
新的代码中将 setTimeout 改为 setImmediate,这样服务端在接收到请求时,会立即响应该请求,而不会等待一段时间后再响应。这样服务端就能够同时响应多个请求,客户端也不会 hang 住了。
在 Node.js 中进行网络编程时,需要特别注意异步编程模型。正确地使用异步编程模型能使程序更加健壮、高效。以上就是本次 Node.js 测验的问题和解决方案,希望对大家有所帮助。