📌  相关文章
📜  网络技术问题 | Node.js 测验 |第 2 组 |问题 12(1)

📅  最后修改于: 2023-12-03 15:11:44.652000             🧑  作者: Mango

Node.js 测验 | 第 2 组 | 网络技术问题 - 问题 12

在开发 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 测验的问题和解决方案,希望对大家有所帮助。